【发布时间】:2018-09-23 11:30:05
【问题描述】:
我有一个模型 Book 的序列化程序 BookSerializer 和模型 Page 的嵌套 PageSerializer。更新Book 实例涉及删除其所有Page 实例,然后创建这些Page 实例,可能有或没有涉及页面的一些新数据或没有或现有数据的更新。
但是我的Book 模型有一个约束,每个Book 实例只能有最大100 页。验证检查在PageSerializer 的validate 方法内完成。我有另一个理由在这里这样做:
def validate(self, attrs):
#some logic here
raise some error if book instance already has 100 pages or if it will have more than 100 pages when combined with new pages when added.
序列化器的更新方法定义或者说BookSerializer是:
def update(self, instance, validated_data):
...
...
因此,发送到更新的数据已经过验证,可以在 update 方法中以 validated_data 的形式访问。
现在,问题来了。嵌套序列化程序PageSerializer 有一个validate 方法,该方法检查该Book 实例的多少页已经存在并针对它们进行验证。
让B 成为Book 的一个实例,该实例已经拥有100 页面。如果我尝试更新 B 而不进行任何更改,发送的数据仍会在 BookSerializer 中进行验证,将其页面数据传递给 PageSerializer,然后最后将 validated_data 传递给 update(self, instance, val;idated_data) 方法。
我的问题是:
- 如何在验证发送更新
B的页面数据之前删除B的所有页面? - 或者如何绕过嵌套序列化程序的验证?仅验证序列化程序,并在保存之前负责验证父序列化程序的更新方法内的嵌套序列化程序。
【问题讨论】:
标签: python django django-models django-rest-framework