簡體   English   中英

Django REST Framework:如何向使用直通表的 M2M 序列化程序添加外主鍵?

[英]Django REST Framework: How to add a foreign primary key to an M2M serializer that uses a through table?

如何將 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直接添加到模型等,但我似乎無法讓它工作。 我錯過了什么?

Order模型的order_item屬性是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM