【发布时间】:2019-05-29 22:03:17
【问题描述】:
我正在尝试使用 Django Rest Framework 序列化程序为我的前端创建 API,以在商店中创建/更新和删除文章。这些文章可以有多个价格(取决于时间)。因此,文章(一)与价格(多)之间存在一对多的关系。我在models.py中定义了这个:
class Article(models.Model):
article_id = models.AutoField(primary_key=True, verbose_name="Article ID")
article_name = models.CharField(max_length=250, verbose_name="Name")
article_order = models.IntegerField(verbose_name="Order")
class Price(models.Model):
price_id = models.AutoField(primary_key=True, verbose_name="Price ID")
article_id = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="Article ID", related_name="Prices")
price_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="Price")
我的 serializers.py 文件如下所示:
from rest_framework import serializers
from .models import *
class PriceSerializer(serializers.ModelSerializer):
class Meta:
model = Price
fields = ('price_price',)
class ArticleSerializer(serializers.ModelSerializer):
Prices = PriceSerializer(many=True)
def create(self, validated_data):
prices_data = validated_data.pop('Prices')
article = Article.objects.create(**validated_data)
for price_data in prices_data:
Price.objects.create(article_id=article, **price_data)
return article
def update(self, instance, validated_data):
prices_data = validated_data.pop('Prices')
Article.objects.filter(article_id=instance.article_id).update(**validated_data)
for price_data in prices_data:
Price.objects.get_or_create(article_id=instance, **price_data)
return instance
class Meta:
model = Article
fields = '__all__'
这很好用,我可以用这个数据创建一个新的文章价格测量:(article_order 稍后将用于订购列表)
{"Prices":[{"price_price":"1"}],"article_name":"Article A","article_order":"1"}
到目前为止,一切都按预期进行。但是当我尝试更新价格时,Price.objects.get_or_create() 语句无法识别现有价格。例如:当第一个价格是 10 欧元,然后是 20 欧元,然后又是 10 欧元时,不会插入最后一个价格,因为 get_or_create 语句不会将其识别为 price 模型的新实例。这可能是有道理的,因为PriceSerializer 不会序列化price_id。但是当我将序列化程序更改为:
class PriceSerializer(serializers.ModelSerializer):
class Meta:
model = Price
fields = '__all__
,我无法再创建实例,因为ArticleSerializer 需要article_id 用于Price 实例(但这还不存在)。
有人知道如何解决这个问题吗? DRF 文档仅包含此类嵌套序列化程序的 create 语句。
https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
【问题讨论】:
标签: python django django-rest-framework django-serializer