【问题标题】:DRF Serializers .orderitem_set.all()DRF 序列化器 .orderitem_set.all()
【发布时间】:2021-12-31 12:06:18
【问题描述】:

我在关注序列化器教程时遇到了一些我不理解其功能的代码。

def get_order_items(self, obj):
        items = obj.orderitem_set.all()
        print(obj)
        print(items)
        return OrderItemSerializer(items, many=True).data

订单商品功能是做什么的。 sn-p 来自下面的序列化程序类:

class OrderSerializer(serializers.ModelSerializer):
    order_items = serializers.SerializerMethodField()

    """
    Calculate order_items field 
    """
    def get_order_items(self, obj):
        items = obj.orderitem_set.all()
        print(obj)
        print(items)
        return OrderItemSerializer(items, many=True).data

    class Meta:
        model = Order
        fields = ('phone',
                  'first_name',
                  'delivery_date',
                  'delivery_time',
                  'address',
                  'comment',
                  'payment',
                  'order_items',)

    def create(self, validated_data):
        items_data = validated_data.pop('order_items')
        order = Order.objects.create(**validated_data)
        for item_data in items_data:
            OrderItem.objects.create(order=order, **item_data)
        return order

【问题讨论】:

  • 您正在获取与订单对象相关的所有项目

标签: python-3.x django django-rest-framework


【解决方案1】:

订单项函数序列化OrderItem 集合,本质上是转换成一个字典(或json)供您在前端使用,因为使用了.data

抓取对象->序列化->转换成json

因此,该函数的结果将是您可以作为响应发送的格式。

【讨论】:

    【解决方案2】:

    这是一个MethodSerializer,它将获得给定Order对象objorderitem_set。然后这些项目通过OrderItemSerializer运行,如果用户触发相应的视图,序列化器数据被收集并与Order的其余数据一起返回。

    不建议以这种方式使用子序列化器。您可以像explained in the documentation [Django-rest-doc] 一样直接将子序列化器用作字段:

    class OrderSerializer(serializers.ModelSerializer):
        order_items = serializers.OrderItemSerializer(source='orderitem_set', many=True)  # ? use the OrderItemSerializer directly
    
        class Meta:
            model = Order
            fields = ('phone', 'first_name', 'delivery_date', 'delivery_time', 'address', 'comment', 'payment', 'order_items')
    
        def create(self, validated_data):
            items_data = validated_data.pop('order_items')
            order = Order.objects.create(**validated_data)
            for item_data in items_data:
                OrderItem.objects.create(order=order, **item_data)
            return order

    【讨论】:

    • 感谢您了解 drf 序列化程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多