【问题标题】:How to limit the number of records in the Serializer如何限制序列化程序中的记录数
【发布时间】:2021-08-08 20:19:05
【问题描述】:

大家好,如何使用序列化器限制结果数?

简单来说就是有一个cmets表,里面可以包含不同类型的帖子。

class CourseComment(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    content = models.TextField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

还有这里的相关表

class CourseMessage(models.Model):
    course_id = models.ForeignKey(Course, on_delete=models.PROTECT)
    author_id = models.ForeignKey(User, on_delete=models.PROTECT)
    text = models.TextField()   # RAW Format must exclude specials chars before publish
    is_pinned = models.BooleanField(default=False)
    comments = GenericRelation('CourseComment')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

我根据文档制作了序列化程序 https://www.django-rest-framework.org/api-guide/relations/

class CourseMessages(serializers.ModelSerializer):
    user = Author(source='authorid', read_only=True)
    files = MessageFiles(source='coursemessageattachedfile_set', many=True)      
    message_comments = MessageComments(source='comments', many=True, read_only=True)

    class Meta:
        model = CourseMessage
        fields = ['text', 'updated_at', 'user', 'files', 'message_comments']


class MessageComments(serializers.RelatedField):
    def to_representation(self, value):
        ct = ContentType.objects.get_for_model(value)
        serializer = Comments(value, read_only=True, source='last_comments')
        return serializer.data


class Comments(serializers.ModelSerializer):
    author = Author(source='user', read_only=True)

    class Meta:
        model = CourseComment
        fields = ['content', 'author']

一切正常,但我希望看到前 3 个 cmets。 也许有人遇到过这样的问题,或者可以建议如何做得更好。 我为 RetrieveAPIView 详细信息页面获取此数据。前三个 cmets 需要显示在前面。

要求 Django==3.2.5 djangorestframework==3.12.4

提前致谢 :)

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    我认为通过指示序列化程序返回结果集的子集,您将一无所获。我认为最好的方法是在进行查询时过滤子集,或者在序列化后过滤数组:

    result_set = CourseComment.objects.all()[:3] # model
    three_first = Comment(result_set, many=True).data # serializer
    

    result_set = CourseComment.objects.all() # model
    three_first = Comment(result_set, many=True).data[:3] # serializer
    

    或者您甚至可以将结果集的子集发送到序列化程序:

    result_set = CourseComment.objects.all() # model
    three_first = Comment(result_set[:3], many=True).data # serializer
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的是SerializerMethodField()

      所以你的代码应该是这样的:

      class CourseMessages(serializers.ModelSerializer):
          user = Author(source='authorid', read_only=True)
          files = MessageFiles(source='coursemessageattachedfile_set', many=True)      
          message_comments = serializers.SerializerMethodField()
      
          def get_message_comments(self, obj):
              message_comments = Comments.objects.all()[:3]
              return MessageComments(message_comments, source='comments', many=True, read_only=True).data
      
          class Meta:
              model = CourseMessage
              fields = ['text', 'updated_at', 'user', 'files', 'message_comments']
      

      【讨论】:

        【解决方案3】:

        如果您将查询集用作:

        class ViewName(generics.RetriveAPIView):
            permission_classes = [IsAuthenticated]
            serializer_class = Comments
            queryset = CourseComment.objects.all()
        

        然后你可以在你的列表函数中使用:

        def list(self, request, *args, **kwargs):
            serializer = Comments(self.get_queryset().order_by('-id')[:3], many = True)
        

        希望它对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-14
          • 2019-12-13
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多