DRF Сериализаторы .orderitem_set.all()
Я изучал учебник по сериализатору и наткнулся на некоторый код, функцию которого я не понял.
def get_order_items(self, obj):
items = obj.orderitem_set.all()
print(obj)
print(items)
return OrderItemSerializer(items, many=True).data
Что делает функция элемента заказа. Фрагмент был взят из класса сериализатора ниже:
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
Функции упорядочивания элементов сериализуют набор OrderItem
, по сути преобразуя его в словарь (или json), готовый для использования фронтендом благодаря использованию .data
.
Захват объектов -> Сериализация -> Преобразование в json
Результатом этой функции будет формат, который вы можете отправить в качестве ответа.
Это MethodSerializer
, который получит orderitem_set
данного Order
объекта obj
. Затем эти элементы проходят через OrderItemSerializer
и данные сериализатора собираются и возвращаются вместе с остальными данными Order
, если пользователь вызывает соответствующее представление.
Использование субсериализатора таким образом, однако, не рекомендуется . Вы можете использовать субсериализатор непосредственно в качестве поля, как это объясняется в документации [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