我有一个具有自定义清洁功能的模型,以确保没有两个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
正如您在示例中看到的,您可以截取已删除的对象,以便创建所需的验证逻辑。