在django-rest-framework的序列化程序中使用反向关系 [英] Using reverse relationships with django-rest-framework's serializer
问题描述
我的模型如下所示:
class User(TimestampedModel):
name = models.CharField(max_length=30, null=False, blank=False)
device = models.CharField(max_length=255, null=False, blank=False)
class Comment(TimestampedModel):
user = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True)
contents = models.CharField(max_length=510)
rating = models.IntegerField(blank=False, null=False)
我的序列化器如下所示:
And my serializer looks like this:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('name',)
class CommentListItemSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Comment
fields = ('user', 'contents', 'rating')
视图:
class CommentsList(generics.ListAPIView):
serializer_class = CommentListItemSerializer
queryset = Comment.objects.all()
这几乎可以完成工作;)。我得到的响应如下所示:
It's almost getting the job done ;). The response I'm getting looks like this:
"results": [
{
"user": {
"name": "Ania"
},
"contents": "Very good",
"rating": 6
},
{
"user": {
"name": "Anuk"
},
"contents": "Not very good",
"rating": 1
}
]
该响应有两个问题。 / p>
There are two problems with that response.
- 我不想使用此嵌套对象 user.name。我想将其作为一个简单的字符串字段接收,例如
用户名
。 - Serializer进行数据库查询(不是每个用户的联接,但需要单独查询)以获取其姓名。既然不能接受,该如何解决?
推荐答案
Serializer对每个用户进行数据库查询(不是联接,而是一个单独的查询)
,以获取其姓名。
Serializer makes a database query (not a join, but a separate query) for each user, to get his/her name.
您可以使用 视图的
属性上的select_related() 。然后访问 queryset
user.name
不会导致进一步的数据库查询。
You can use select_related()
on the queryset
attribute of your view. Then accessing user.name
will not result in further database queries.
class CommentsList(generics.ListAPIView):
serializer_class = CommentListItemSerializer
queryset = Comment.objects.all().select_related('user') # use select_related
我不想拥有此嵌套对象
user.name
。我想让
作为一个简单的字符串字段接收它,例如用户名
您可以使用源
定义只读的用户名
字段> 参数。这将返回一个 username
字段作为响应。
You can define a read-only username
field in your serializer with source
argument. This will return a username
field in response.
class CommentListItemSerializer(serializers.ModelSerializer):
# define read-only username field
username = serializers.CharField(source='user.name', read_only=True)
class Meta:
model = Comment
fields = ('username', 'contents', 'rating')
这篇关于在django-rest-framework的序列化程序中使用反向关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!