Django REST Framework: Как добавить внешний первичный ключ в сериализатор M2M, использующий сквозную таблицу? - PullRequest
0 голосов
/ 26 января 2020

Как добавить первичный ключ из отношения M2M в мой сериализатор?

Примеры, которые я видел, работают только при сквозной пользовательской модели не установлено.

модели:

class Inventory(models.Model):
    quantity = models.IntegerField()
    ...

class Order(models.Model):
    order_items = models.ManyToManyField(Inventory, through='myapp.OrderItem')
    ...

class OrderItem(models.Model):
    order = models.ForeignKey(Order)
    inventory = models.ForeignKey(Inventory)
    sell_price = models.IntegerField()
    quantity = models.IntegerField()

сериализаторы:

class InventorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Inventory
        fields = ('id', )

class OrderItemSerializer(serializers.ModelSerializer):
    inventory_id = serializers.PrimaryKeyRelatedField(source='inventory.id', read_only=True)

    class Meta:
        model = OrderItem
        fields = ('order_id', 'inventory_id', 'sell_price', 'quantity',)

class OrderSerializer(serializers.ModelSerializer):
    order_items = OrderItemSerializer(many=True)
    inventory_id = serializers.PrimaryKeyRelatedField(source='inventory.id', read_only=True)

    class Meta:
        model = Order
        fields = '__all__'

Ожидаемые результаты:

[
    {
        "id": 1,
        "order_items": [
            {
                "inventory_id": 1,
                "sell_price": "2.00",
                "quantity": 12
            },
            {
                "inventory_id": 2,
                "sell_price": "9.50",
                "quantity": 6
            },
            {
                "inventory_id": 3,
                "sell_price": "77.77",
                "quantity": 1
            }

... <other fields>

],

Я пробовал различные комбинации имена полей в мета, добавление InventorySerializer непосредственно в модель и т. д. c. но я не могу заставить его работать. Чего мне не хватает?

1 Ответ

1 голос
/ 26 января 2020

Атрибут order_item вашей модели Order представляет собой список экземпляров модели Inventory. Независимо от вашего пользовательского определения таблицы через M2M, поиск запроса с помощью атрибута order_item вернет Inventory экземпляров вместо желаемых OrderItem экземпляров.

Один из возможных способов получить выходные данные в вашем желаемый формат может быть следующим -


class OrderItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = OrderItem
        fields = ('order_id', 'inventory_id', 'sell_price', 'quantity',)

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

    class Meta:
        model = Order
        fields = '__all__'

    def get_order_items(self, instance):
        order_items = OrderItem.objects.filter(order=instance)
        return OrderItemSerializer(order_items, many=True).data

...