2016-12-02 21 views
0

モデルはUserモデルとPresentモデルで構成されています。 Userは、複数のPresentを持つことができますが、PresentはユニークUserありますPrimaryKeyRelatedFieldを別のフィールドに置き換えます

マイmodels.pyは次のとおりです。

from django.db import models 
from django.contrib.auth.models import User 

class Present(models.Model): 
    name = models.CharField(max_length=15) 
    price = models.FloatField() 
    link = models.CharField(max_length=15) 
    isAlreadyBought = models.BooleanField() 
    user = models.ForeignKey(User, related_name='presents', on_delete=models.CASCADE) 

マイserializers.pyです:

from django.contrib.auth.models import User, Group 
from rest_framework import serializers 
from blog.models import Present, Location 
from django.contrib.auth.models import User 


class UserSerializer(serializers.ModelSerializer): 

    presents = serializers.PrimaryKeyRelatedField(many=True, queryset=Present.objects.all(), required=False) 

    class Meta: 
     model = User 
     fields = ('username', 'password', 'email', 'presents') 

    def create(self, validated_data): 
     user = super().create(validated_data) 
     if 'password' in validated_data: 
       user.set_password(validated_data['password']) 
       user.save() 
     return user 



class PresentSerializer(serializers.ModelSerializer): 

    user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), read_only=False, many=False) 

    class Meta: 
     model = Present 
     fields = ('name', 'link', 'price', 'isAlreadyBought', 'user') 

    def create(self, validated_data): 
     return Present.objects.create(**validated_data) 

現在、私はすべて取得したい場合私は主キー(views.py)を使用します:

しかし、私はむしろUserusernameフィールドをプライマリキーの代わりに使用します。

私はSlugRelatedFieldを使用して試してみましたが、私はこれが私の目標を達成するための正しい方法であることを確認していない:

class PresentSerializer(serializers.ModelSerializer): 

    user = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='username', read_only=False, many=False) 

    class Meta: 
     model = Present 
     fields = ('name', 'link', 'price', 'isAlreadyBought', 'user') 

    def create(self, validated_data): 
     return Present.objects.create(**validated_data) 

そして、この変更で、私は今、そのidユーザー'Marcel'を取得するには、次のViewを使用します

class PresentsOfUser(viewsets.ModelViewSet): 
    queryset = Present.objects.all().filter(user='Marcel') 
    serializer_class = PresentSerializer 

しかし、この場合には、私が手::33ある

ValueError: invalid literal for int() with base 10: 'Marcel' 

しかし、私は(以前と)user=33によってuser='Marcel'を交換する場合は、私が取得:ユーザーフィールドは今usernameはなく、ユーザーのidある

[{"name":"Nintendo","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"},{"name":"Gamecube","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"}] 

user='Marcel'とフィルタリングが失敗した理由しかし、私は...

+0

現在のシリアライザのフィールドで '' user__username''を試しましたか? – Brobin

+0

詳細を教えてください。 – floflo29

答えて

1

を理解していない私はあなたの問題は、この行/ wのだと思います:仮定Marcel

queryset = Present.objects.all().filter(user='Marcel')

は= pkとユーザー名です>33

のように文字列を使用してフィルタリングすることはできません。

queryset = Present.objects.all().filter(user__username='Marcel')

希望します。

+0

現在のシリアライザで 'PrimaryKeyRelatedField'または' SlugRelatedField'を使用していますか? – floflo29

+0

'pk'値の代わりに 'username'が必要な場合は、 'SlugRelatedField'を使用します。 – mishbah

0

(mishbahが提案されているようuser__username='Marcel'で)私のシリアライザでPrimaryKeyRelatedFieldを維持しながら、私はget_querysetメソッドをオーバーライドしてしまった:

class PresentsOfUser(viewsets.ModelViewSet): 

    serializer_class = PresentSerializer 

    def get_queryset(self): 
     """ 
     Optionally restricts the returned purchases to a given user, 
     by filtering against a `username` query parameter in the URL. 
     """ 
     queryset = Present.objects.all() 
     username = self.kwargs['user'] 
     if username is not None: 
      queryset = queryset.filter(user__username=username) 

     if len(queryset) == 0: 
      raise Http404 

     return queryset 

PrimaryKeyRelatedFieldを交換するときにもSlugRelatedFieldで動作します:

user = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='username', read_only=False, many=False) 

私のPresentモデルのForeignKeyto_field='username'を追加する:

user = models.ForeignKey(User, related_name='presents', to_field='username', on_delete=models.CASCADE) 
関連する問題