gpt4 book ai didi

json - 在 DRF 中序列化嵌套对象

转载 作者:行者123 更新时间:2023-12-04 10:44:09 25 4
gpt4 key购买 nike

我的网站上有一个测试对象,我试图正确地进入数据库。
它是一个带有嵌套产品数据的订单对象。
这是前端发布的 JSON 示例:

{
"phone": "123456789",
"first_name": "name",
"delivery_date": "2020-01-06",
"delivery_time": 2,
"address": "address",
"comment": "comment",
"payment": 0,
"order_items": [
{
"quantity": 2,
"pizza": 1
},
{
"quantity": 3,
"pizza": 2
}
]
}

这是我的 serializers.py
class OrderItemSerializer(serializers.ModelSerializer):
quantity = serializers.IntegerField()
pizza = serializers.SerializerMethodField()
print(pizza, quantity)

def get_pizza(self, obj):
print(obj.pizza.id)
return obj.pizza.id

class Meta:
model = OrderItem
fields = ('quantity',
'pizza',)


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',)

结果, order_items 始终为空: "order_items": []
我正在使用 Swagger 来测试和记录 API。我可以直接从那里发布订单而没有错误,但即使我手动添加订单项目,它们仍然不会出现在服务器响应正文中。这一定意味着我没有正确处理嵌套对象。

邮政
{
"phone": "123456",
"first_name": "string",
"delivery_date": "2000-10-21",
"delivery_time": 2,
"address": "string",
"comment": "string",
"payment": 0,
"order_items": [
{"pizza": 2,"quantity": 3},
{"pizza": 1,"quantity": 4}]
}

201、响应体:
{
"phone": "123456",
"first_name": "string",
"delivery_date": "2000-10-21",
"delivery_time": 2,
"address": "string",
"comment": "string",
"payment": 0,
"order_items": []
}

我还在上面的代码中设置了一些 print 行,看起来根本没有使用 OrderItemSerializerget_order_items 打印订单 ID 和一个空数组,而 get_pizza 在网站上下订单时不打印任何内容。

最佳答案

您需要覆盖序列化程序的 create()制作方法 writable nested serializers .

尝试这样的事情:

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

您也可以使用 OrderItemSerializer作为没有 SerializerMethodField 的字段.您可以使用 source指定字段的参数 source :
order_items = serializers.OrderItemSerializer(many=True, source="orderitem_set")

关于json - 在 DRF 中序列化嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com