如何使用inline_formsety在模型/表单上的clean()函数中排除已删除的对象



我有一个具有自定义清洁功能的模型,以确保没有两个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中已删除的对象?我应该在表格上做一个清理吗?如果是,我如何引用已删除的对象?

您需要在从formset获得的deleted_objects之上创建逻辑。由于这个原因,在表单集中实现这个逻辑更容易,因为在模型的clean()方法中,您可以看到单个当前实例(而不是即将到来的新实例的完整集合)。

Django文档中解释了如何处理deleted_objects

instances = formset.save(commit=False)
for obj in formset.deleted_objects:
# ... your logic here

正如您在示例中看到的,您可以截取已删除的对象,以便创建所需的验证逻辑。