如何在 Django 4.1+ 中获取 UniqueConstraint 的 ValidationError

How to get a ValidationError for a UniqueConstraint in Django 4.1+

提问人:RobV 提问时间:5/19/2023 最后编辑:RobV 更新时间:5/19/2023 访问量:180

问:

从 Django 4.1 开始,约束应该在模型验证期间进行检查*。 因此,当我尝试通过违反约束的标准(而不是使用自定义)创建一个新条目时,我期望在模型上有一个论坛。我希望创建表单会再次出现,并带有错误消息,就像违反模型字段的设置一样。ValidationErrorUniqueConstraintCreateViewFormunique=True

但是,我得到一个相反的(导致 500 内部服务器错误),这意味着从未进行过验证,并且仅在创建数据库时发现违反了约束。IntegrityError

我做错了什么吗?

模型如下所示:

class Child(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

    class Meta:
        indexes = [models.Index(fields=['name'])]
        constraints = [models.UniqueConstraint(fields=['name', 'parent'], name='unique_ChildName')]

(* 旧版本没有这样做,期望在特定情况下使用 UniqueConstraint 约束,并且还有其他 StackOverflow 问题可以自己执行此操作,例如

但是自从 Django 4.1 以来,这种情况发生了变化,我的问题专门针对 Django 4.1+)

编辑:根据 Willem Van Onsem 的评论,我已将该字段添加到表单字段中。但为了让它不可变,我把表单做成这样:parent

class ChildCreateForm(ModelForm):
    parent = ModelChoiceField(queryset=None, disabled=True, required=False)

    class Meta:
        model = Child
        fields = ['parent', 'name']

    def __init__(self, parent_id=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['parent'].queryset = Parent.objects.filter(pk=parent_id)
        self.fields['parent'].initial = parent_id

这在视图上:

    form_class = ChildCreateForm
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['parent_id'] = ... # some project-specific logic
        return kwargs
django 验证 unique-constraint

评论

1赞 willeM_ Van Onsem 5/19/2023
你能展示你使用的视图和表单吗?我假设或父级或名称不是表格的一部分?
0赞 RobV 5/19/2023
你是对的,父级不是表格的一部分。添加它时,我收到 ValidationError。有没有办法在不包含父字段的情况下保留它?
1赞 willeM_ Van Onsem 5/19/2023
你能分享一下视图和表单吗?
0赞 RobV 5/19/2023
我有。如果您想发布您的原始评论作为答案,那么我将接受它作为解决方案。

答: 暂无答案