【问题标题】:DRF - Format Serializer's output from QuerySetDRF - 从 QuerySet 格式化序列化程序的输出
【发布时间】:2015-09-21 16:40:52
【问题描述】:

我第一次使用 Django Rest Framework,现在我正在尝试获得这样的输出:

{
  "qty": 5,
  "total": 20,
  "items": [
     {
       "id": 1,
       "name": "name_1"
     },
     {
       "id": 2,
       "name": "name_2"
     }
  ]
}

来自序列化程序。上面输出中的结果数据来自一个查询集。我想使用序列化程序类中的查询集。如果不在序列化程序中进行查询,我无法获得我想要的结果:

class ResSerializer(serializers.Serializer):

    qty = serializers.SerializerMethodField()
    items = serializers.SerializerMethodField()
    total = serializers.SerializerMethodField()

    def get_qty(self, obj):
        try:
            return Model.objects.filter(...)\
                                .aggregate(qty=Sum('job__long'))\
                                .get('qty')
        except KeyError:
            return 0

    def get_items(self, obj):
        print 'testing'

    def get_total(self, obj):
        return 0

    class Meta:
        fields = ('qty', 'items', 'total')

我这样调用序列化器:

queryset = Model.objects.filter(...)
serialized = ResSerializer(queryset, many=False, context={'current_user': request.user})

但这不是我想要的。有什么建议吗?谢谢。

更新

这是我查询的模型:

class Intermediate(models.Model):

    partner = models.ForeignKey('partner.Partner')
    job = models.ForeignKey(Job)
    joined_at = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    status = models.SmallIntegerField(default=STATUS_ACCEPTED)
    reason_index = models.SmallIntegerField('Cancel reason', default=REASON_3)
    start_time = models.TimeField(null=True)
    end_time = models.TimeField(null=True)
    start_date = models.DateField(null=True)
    end_date = models.DateField(null=True)

这是视图:

class ResView(CustomAPIView):

    authentication_classes = (CustomTokenAuthentication, )
    # permission_classes = (PartnerAuthenticatedOnly, )  # Uncomment this on server

    def post(self, request, *args, **kwargs):
        try:
            queryset = JobPartner.objects.filter(...)
            serialized = ResSerializer(queryset, many=False, context={'current_user': request.user})
            response_success_object(self.response_dic, serialized.data)
            return Response(self.response_dic)

        except Exception, e:
            print e

【问题讨论】:

  • 请发表您的模型和观点。
  • @RahulGupta 已更新。
  • qty 的值是从不同的模型计算出来的,因为long 字段不在Intermediate 中吗? items 列表是如何计算出来的?
  • 它来自中级的Job FK。我在那部分编辑了问题。
  • 另外,idname 字段是从哪里计算出来的?

标签: django serialization django-rest-framework


【解决方案1】:

要获得items 表示,您可以使用ItemsSerializer,它将给出具有idname 的序列化数据。

class ItemsSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel # specify your model
        fields = ('id', 'name') # return these 2 fields in the representation

这个序列化器在处理多个实例时会以下面的方式返回序列化的数据。

[
     {
       "id": 1,
       "name": "name_1"
     },
     {
       "id": 2,
       "name": "name_2"
     }
  ]

现在,qtytotal 字段取决于查询集,而不是查询集的特定对象,如果您在视图中单独计算它们会更好。然后创建包含字段itemsqtytotal 的字典并将其作为响应返回。

class ResView(CustomAPIView):

    authentication_classes = (CustomTokenAuthentication, )
    # permission_classes = (PartnerAuthenticatedOnly, )  # Uncomment this on server

    def post(self, request, *args, **kwargs):
        try:
            queryset = JobPartner.objects.filter(...)
            qty = self.get_qty() # compute the value of qty
            total = self.get_total() # compute the value of total
            items_serializer = ItemsSerializer(queryset, many=True) 
            items = items_serializer.data # compute the value of items
            return_dict = { # prepare response data
                'qty' : qty,
                'total': total,
                'items': items 
            }
            return Response(return_dict) # return the response

        except Exception, e:
            print e

【讨论】:

  • 这实际上是我通过“同时”实现的,它工作正常。我想知道是否有另一种方法可以获得我想要的结果。我会等一会儿,我很乐意接受你的回答。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2023-03-27
  • 2021-06-11
  • 2014-07-24
  • 1970-01-01
相关资源
最近更新 更多