我有一个带有自定义清理函数的模型,以确保不会有两个DateRange重叠:
class MyModel(models.Model):
date_range = DateRangeField()
def clean(self):
error_dict = {}
if MyModel.objects.exclude(id=self.id).filter(
date_range__overlap=self.date_range):
error_dict['date_range'] = ValidationError(
'Range can not overlap with an existing period.',
code='overlap_period')
if error_dict:
raise ValidationError(error_dict)这是可行的,但如果我使用inline_formset一次提交多条记录,并删除一条可以消除冲突的记录(同时更新其他记录),ValidationError仍然会引发。
这是因为filter函数是对现有记录执行的,而不是对新更新的记录执行的。
如何修改filter以排除inline_formset中已删除的对象?我应该在表单上做一个清理吗?如果是,我如何引用已删除的对象?
发布于 2021-10-04 15:45:53
您需要在从表单集中获得的deleted_objects之上创建逻辑。因此,在表单集中实现此逻辑会更容易,因为在模型的clean()方法中,您可以看到单个当前实例(而不是即将到来的新实例的全集)。
在Django doc中解释了如何处理deleted_objects
instances = formset.save(commit=False)
for obj in formset.deleted_objects:
# ... your logic here正如您在示例中所看到的,您可以截获已删除的对象,以便创建所需的验证逻辑。
https://stackoverflow.com/questions/69435303
复制相似问题