У меня на сайте есть тестовый объект, который я пытаюсь правильно ввести в базу данных. Это объект заказа с вложенными данными о продукте. Вот пример 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. Я могу отправлять заказы напрямую оттуда без ошибок, но даже когда я добавляю элементы заказа вручную, они все равно не отображаются в теле ответа сервера. Это должно означать, что я не обрабатываю вложенные объекты должным образом.
POST
{
"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
строк в коде выше, и похоже, что OrderItemSerializer
вообще не используется. get_order_items
печатает идентификатор заказа и пустой массив, в то время как get_pizza
ничего не печатает при оформлении заказа на сайте.