Python DRF正在序列化程序update()调用中更新ManyToMany 模型: 序列化程序: 故事:

Python DRF正在序列化程序update()调用中更新ManyToMany 模型: 序列化程序: 故事:,python,django,rest,serialization,django-rest-framework,Python,Django,Rest,Serialization,Django Rest Framework,此序列化程序的目标是在每次Dvd更改时更新许可证.computed_值。每年年底,会计都会检查当年售出的所有电影,并计算每部电影的总价值(final_value)。许可证是电影制作人和公司之间的合同。每售出一张dvd,公司就有xx%钱。有很多公司,因此会计必须从相关的dvd的最终值中计算xx%(通常约为5%),并将其保存到特定的许可证中。计算值 (清楚吗?如果需要,我可以举个例子) 基本公式是: Dvd.final_value = Dvd.price * Dvd.sold_copies Dvd.

此序列化程序的目标是在每次
Dvd
更改时更新
许可证.computed_值。每年年底,会计都会检查当年售出的所有电影,并计算每部电影的总价值(
final_value
)。
许可证是电影制作人和公司之间的合同。每售出一张
dvd
,公司就有
xx%
钱。有很多公司,因此会计必须从相关的
dvd
最终值中计算
xx%
(通常约为5%),并将其保存到特定的
许可证中。计算值

(清楚吗?如果需要,我可以举个例子)
基本公式是:

Dvd.final_value = Dvd.price * Dvd.sold_copies
Dvd.licence_dvd.computed_value = Dvd.final_value * Dvd.licence_dvd.percent
第一个正在工作,但是第二个。。。棘手。
如果每张
dvd只有一张
许可证
,那就很容易了(validated_data.pop,保存
许可证
,保存
dvd
)。问题是,我的数据库中每个
dvd
有多个
license
,因此
license\u dvd
返回多个对象
通过迭代
验证的数据['license\u dvd']
可以得到:

OrderedDict([('percent', Decimal('0.5')), ('computed_value', Decimal('1234'))])
每个
许可证
(这只是一个示例)

问题:
  • 我这样做对吗?如果某些值由公式重新计算,则定义和计算应放在何处?在API/序列化程序/前端级别
  • 更新函数中的实例和已验证的_数据之间有什么区别?我知道已验证的_数据是已验证的传入数据,但何时以及如何访问/修改其(或实例)变量
  • 如何修改
    许可证\u dvd
    dvd序列化程序中的数据
。更新功能
非常感谢您提供的有用信息

首先,我在您的示例中找不到多对多的关系,因此问题标题似乎有误导性(它本质上是一对多,多个许可证可以指单个DVD)。有关问题:

  • 我绝对肯定序列化程序不是定义业务逻辑的正确位置(更新计数器正是其中的一部分)。我建议将其放置在视图中。序列化程序只能用于序列化/反序列化数据(例如,将数据从JSON转换为对象并返回)
  • instance和validated_数据之间的区别在于instance是要更改的数据库中现有行的表示形式,validated_数据是用于更新的数据(在更新请求中序列化)
  • 正如我上面提到的,序列化程序不是合适的位置。否则,您必须考虑到dvd.license\u dvd本质上是一个集合,而不是一个值(实际上,在您的逻辑中,每个dvd可以有多个许可证)。因此,为了更新许可证,您必须对其进行迭代:
dvd.license\u dvd中的许可证的
:
请在此处为每个许可证执行更新
如果每个DVD只有一个许可证,请考虑使用<代码> OnEndoField,作为一个更合适的。

Dvd.final_value = Dvd.price * Dvd.sold_copies
Dvd.licence_dvd.computed_value = Dvd.final_value * Dvd.licence_dvd.percent
OrderedDict([('percent', Decimal('0.5')), ('computed_value', Decimal('1234'))])