class Dvd(models.Model):
movie = models.ForeignKey(Movie)
price = models.DecimalField(...)
sold_copies = models.IntegerField(...)
final_value = models.DecimalField(...)
class Licence(models.Model):
distribution = models.ForeignKey(Dvd, related_name="licence_dvd")
percent = models.DecimalField(...)
computed_value = models.DecimalField(...)
class LicenceSerializer(serializers.ModelSerializer):
class Meta:
model = Licence
class DvdSerializer(serializers.ModelSerializer):
movie = MovieSerializer()
licence_dvd = LicenceSerializer(many=True)
class Meta:
model = Dvd
fields = ('id', 'price', 'sold_copies', 'final_value', 'movie', 'licence_dvd')
def update(self, instance, validated_data):
instance.price = validated_data.get('price', instance.price)
instance.sold_copies = validated_data.get('sold_copies', instance.sold_copies)
instance.final_value = instance.price * instance.sold_copies # is this ok?
# TODO recalculate the licence values
instance.save()
return instance
此序列化程序的目标是每次Licence.computed_value
更改时更新Dvd
。在每年年底,会计师会查看当年销售的所有电影,并计算每个电影的总价值(final_value
)。 licences
是电影制片人和公司之间的合约。每卖出dvd
,公司就有xx%
钱。有很多公司,因此会计师必须从相关xx%
的{{1}}计算final_value
(通常约为5%)并将其保存到特定dvd
。
(这是否清楚?如果需要,我可以举一个例子)
基本公式是:
licence.computed_value
第一个是工作,但第二个是......很棘手
如果每Dvd.final_value = Dvd.price * Dvd.sold_copies
Dvd.licence_dvd.computed_value = Dvd.final_value * Dvd.licence_dvd.percent
只有一个licence
,则很容易(validated_data.pop,保存dvd
,保存licence
)。问题是每个dvd
数据库中有多个licences
,因此dvd
返回多个对象。
迭代licence_dvd
给了我:
validated_data['licence_dvd']
每个OrderedDict([('percent', Decimal('0.5')), ('computed_value', Decimal('1234'))])
(这只是一个例子)。
licence
。update function?licence_dvd
数据
非常感谢您提供任何有用的信息!
答案 0 :(得分:0)
首先,我在你的例子中找不到ManyToMany关系,所以问题标题似乎有误导性(它本质上是一对多的,许多许可证可以引用一张DVD)。对于问题:
for license in dvd.license_dvd:
do your updates here for each license
如果每张DVD确实只有一个许可证,请考虑使用OneToOneField
代替,更合适。