我有一個模型,它包含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
):
class PresentsOfUser(viewsets.ModelViewSet):
queryset = Present.objects.all().filter(user=33)
serializer_class = PresentSerializer
但是,我寧願使用User
的username
字段而不是主鍵。
我已經使用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)
而與此修改,我現在用下面的View
獲得'Marcel'
其id
用戶是33
:
class PresentsOfUser(viewsets.ModelViewSet):
queryset = Present.objects.all().filter(user='Marcel')
serializer_class = PresentSerializer
但在這種情況下,我得到:
ValueError: invalid literal for int() with base 10: 'Marcel'
但是如果我更換user='Marcel'
由user=33
(如前),我得到:
[{"name":"Nintendo","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"},{"name":"Gamecube","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"}]
現在在哪裏,用戶字段是username
而不是用戶的id
。
不過,我不明白爲什麼有user='Marcel'
失敗過濾...
您是否在本串行器的字段中嘗試過''user__username''? – Brobin
你能否詳細說明? – floflo29