约束 unique_together 可能与 django 类中的唯一字段冲突
Posted
技术标签:
【中文标题】约束 unique_together 可能与 django 类中的唯一字段冲突【英文标题】:Constrain unique_together could have conflict with the unique_field in dajngo Class 【发布时间】:2022-01-10 05:27:16 【问题描述】:我想知道在属于unique_together
的数组的字段之一中使用约束unique_together
以及参数unique=true
是否存在任何冲突。
我无法删除我的字段的参数unique=true
,因为它在另一个模型中用作外键。
class User(AbstractUser):
# User information
fiscal_number = models.CharField(max_length=30,unique=True)
phone = models.CharField(max_length=15, null=True)
email = models.EmailField(max_length=254, verbose_name='email address')
class Meta:
unique_together = ['fiscal_number', 'email']
如您所见,目标是使 fiscal_number
和 email
字段的组合独一无二。
【问题讨论】:
如果您将unique=True
设置为fiscal_number
,那么它也是unique_together
的一部分是没有意义的。
【参考方案1】:
基本上,我想知道在属于
unique_together
的数组的字段之一中使用约束unique_together 以及参数unique=true
是否存在任何冲突。
没有意义。事实上,通过设置unique=True
意味着不可能有两个用户拥有相同的fiscal_number
,除非这两个用户是同一个用户。
unique_together = ['fiscal_year', 'email']
表示fiscal_year
和email
的组合 必须是唯一的。这意味着不能有两个用户同时 fiscal_year
和 email
相同(除非这两个用户是同一个用户)。但由于我们已经将fiscal_year
设为唯一字段,我们已经知道这不可能发生。
您也可以将email
字段标记为unique=True
。这不等同于unique_together = ['fiscal_number', 'email']
。对于unique_together
,两列的组合应该是唯一的,而在多个字段上设置unique=True
,意味着所有User
s都有一个不同的fiscal_year
,一个不同的email
等等。
【讨论】:
是的,你是对的。但是,如果我只使用参数 unique=true 设置 fiscal_number 可能会发生许多 fiscal_number 具有相同的电子邮件,这就是我需要的为了避免,因为我必须让每个 fiscal_number 都是唯一的,并且还有一个唯一的 email,这就是为什么我想使用 unique_together 约束。还是您认为有另一种解决方法? @user15854983:您也可以使email
独一无二。但是这里的unique_together
暗示 fiscal_number
已经是唯一的了。
哦,是的,我也想过,但我不知道这是可能的,有两个字段是唯一的。兄弟我去试试,谢谢以上是关于约束 unique_together 可能与 django 类中的唯一字段冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django 的核心模型中添加“unique_together”约束?
为啥我的 Django ModelForm 不会引发 unique_together 约束的验证错误?
UniqueConstraint 与 unique_together 之间的区别 - Django 2.2?
为啥 Django 不将我的 unique_together 约束强制为 form.ValidationError 而不是抛出异常?