我有一个模型,它包含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