在django-rest-framework的序列化程序中使用反向关系 [英] Using reverse relationships with django-rest-framework's serializer

查看:310
本文介绍了在django-rest-framework的序列化程序中使用反向关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的模型如下所示:

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.


  1. 我不想使用此嵌套对象 user.name。我想将其作为一个简单的字符串字段接收,例如用户名

  2. Serializer进行数据库查询(不是每个用户的联接,但需要单独查询)以获取其姓名。既然不能接受,该如何解决?


推荐答案


Serializer对每个用户进行数据库查询(不是联接,而是一个单独的查询)
,以获取其姓名。

Serializer makes a database query (not a join, but a separate query) for each user, to get his/her name.

您可以使用 视图的 queryset 属性上的select_related() 。然后访问 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆