【问题标题】:How to get data from multiple nested serializer?如何从多个嵌套序列化程序中获取数据?
【发布时间】:2019-03-22 15:54:13
【问题描述】:

序列化器

class CarrGetOrderDetails(serializers.Serializer):
    order = CarrGetOrderDetail(required=False)
    template = CarrGetOrderDetailTemplate(required=False, many=True)
    extra_fields = CarrGetOrderDetailExtraFields(required=False, many=True)

查看文件

class CarrierOrderDetails(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        order_id = request.GET['order_id']
        #order_obj = Order.objects.filter(id=order_id)

        obj = self.get_objects(order_id)
        #print('#####',obj)
        serializ = CarrGetOrderDetails(obj, many=True)
        return Response(serializ.data)

    def get_objects(self, order_obj):
        model1 = Order.objects.filter(id=order_obj)
        model2 = OrderTemplate.objects.filter(id=1)
        model3 = OrderExtraField.objects.filter(id=1)
        obj = {'order': model1, 'template': model2, 'extra_fields': model3}
        return obj

这里我尝试点击多个序列化器对象,但在 serializer.data 中得到空数据

输出

[
{},
{},
{}
]

【问题讨论】:

    标签: django serialization django-models django-rest-framework


    【解决方案1】:

    您正在使用many=True 初始化您的序列化程序,因此它需要一个对象列表。您应该将对象列表作为第一个参数传递给序列化程序类构造函数,或者删除 many=True kwarg。

    另外,由于您要传入字典,我会使用 data={...} kwarg 而不是第一个参数 instance

    作为快速测试,您可以执行以下修改:

    obj = self.get_objects(order_id)
    serializ = CarrGetOrderDetails(obj, many = True)
    
    obj = self.get_objects(order_id)
    serializ = CarrGetOrderDetails(data=[obj], many = True)
    

    参考文献

    【讨论】:

    • 感谢您的回复!!我试图做出改变,但问题是无效数据。需要字典,但得到了 QuerySet。
    • 现在您进入下一个问题。您的订单字段是 many=False,但您正在通过查询集传递对象列表。您可以使字段 many=True 或仅通过将 .first() 附加到 get objects 函数中的 order 过滤器来为其提供单个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多