提问人:RobV 提问时间:5/19/2023 最后编辑:RobV 更新时间:5/19/2023 访问量:180
如何在 Django 4.1+ 中获取 UniqueConstraint 的 ValidationError
How to get a ValidationError for a UniqueConstraint in Django 4.1+
问:
从 Django 4.1 开始,约束应该在模型验证期间进行检查*。
因此,当我尝试通过违反约束的标准(而不是使用自定义)创建一个新条目时,我期望在模型上有一个论坛。我希望创建表单会再次出现,并带有错误消息,就像违反模型字段的设置一样。ValidationError
UniqueConstraint
CreateView
Form
unique=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 唯一约束 + 表单错误
- 如何验证跨外键的唯一性约束 (django)
- django 2.2 中的 UniqueConstraint 不会引发 ValidationError
- django: ValidationError with UniqueConstraint on Model.Forms, clean() 。
但是自从 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
答: 暂无答案
评论