【问题标题】:In Django Rest Framework, how to limit number foreign key objects being serialized在 Django Rest Framework 中,如何限制被序列化的外键对象的数量
【发布时间】:2016-11-12 08:39:20
【问题描述】:

我正在对 Product 模型及其 cmets 进行序列化。这是我的简单代码:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    comment_set = CommentSerializer(many=True, read_only=True)
    class Meta:
        model = Product
        fields = [
            'title',
            'comment_set'
        ]


class CommentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Comment
        fields = [
            'text',
        ]


class Comment(models.Model):
    product = models.ForeignKey(Product, null=True, blank=True, db_index=True)


class Product(models.Model):
    title = models.CharField(max_length=50)
    ...

问题: 如果产品有很多 cmets。例如,500 厘米。全部 500 篇都被连载了。

如何将结果限制为我自己选择的数量,例如 100 cmets?

我在发布之前做了一些研究,但只发现了关于过滤的问题。

谢谢。

【问题讨论】:

标签: django serialization foreign-keys django-rest-framework foreign-key-relationship


【解决方案1】:

Product 模型上定义一个新方法,该方法返回一个具有有限数量的 cmets 的查询集。

然后将该方法作为CommentSerializer 的源传递到您的ProductSerializer 中。

class Product(models.Model):
    title = models.CharField(max_length=50)


    def less_comments(self):
        return Comment.objects.all().filter(product=self).order_by("-id")[:100]

然后在ProductSerializer:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    comment_set = CommentSerializer(many=True, read_only=True, source="less_comments")

PS:凭记忆写代码,没有测试。但应该工作。

【讨论】:

    【解决方案2】:

    您可以编写自定义ListSerializer并输入CommentSerializer,然后在ProductSerializer中创建自定义字段,基于默认相关名称的来源:

    class LimitedListSerializer(serializers.ListSerializer):
    
        def to_representation(self, data):
            data = data.all()[:100]
            return super(FilteredListSerializer, self).to_representation(data)
    
    class CommentSerializer(serializers.HyperlinkedModelSerializer):
    
        class Meta:
                list_serializer_class = LimitedListSerializer
                model = Comment
                fields = [
                    'text',]
    
    class Product(serializers.HyperlinkedModelSerializer):
        related_comments = CommentSerializer(many=True, read_only=True, source='comment_set')
    

    当你传递many=True时,将调用列表序列化器。

    【讨论】:

      【解决方案3】:

      您需要处理 CommentSerializer 的查询集来控制您保留哪些查询集。

      您可以通过覆盖get_queryset 来做到这一点。例如,针对当前用户过滤它们。请注意,我采用此示例是因为它强调了如何使用请求的上下文进行过滤:

      class CommentSerializer(serializers.HyperlinkedModelSerializer):
          def get_queryset(self):
              user = self.context['request'].user
              queryset = Comment.objects.filter(user=user)
              return queryset
      
          class Meta:
              model = Comment
              fields = [
                  'text',
              ]
      

      【讨论】:

      • 谢谢。完美运行,感谢您指出请求上下文。也感谢您提供其他答案,尽管我尚未测试您的解决方案。但它们也应该起作用。
      • 自 2020 年起,此代码不会让您限制查询结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2017-10-05
      • 1970-01-01
      • 2016-10-22
      • 2019-01-19
      • 2014-01-31
      相关资源
      最近更新 更多