![](/img/trans.png)
[英]Django rest framework nested serializer not working for M2M relations
[英]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.