首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用inline_formsety在模型/表单上的clean()函数中排除已删除的对象

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

Stack Overflow用户
提问于 2021-10-04 11:35:19
回答 1查看 30关注 0票数 0

我有一个带有自定义清理函数的模型,以确保不会有两个DateRange重叠:

代码语言:javascript
运行
复制
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中已删除的对象?我应该在表单上做一个清理吗?如果是,我如何引用已删除的对象?

EN

回答 1

Stack Overflow用户

发布于 2021-10-04 15:45:53

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

Django doc中解释了如何处理deleted_objects

代码语言:javascript
运行
复制
instances = formset.save(commit=False)
for obj in formset.deleted_objects:
    # ... your logic here

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69435303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档