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
Вернуться на верх