约束 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_numberemail 字段的组合独一无二。

【问题讨论】:

如果您将unique=True 设置为fiscal_number,那么它也是unique_together 的一部分是没有意义的。 【参考方案1】:

基本上,我想知道在属于unique_together 的数组的字段之一中使用约束unique_together 以及参数unique=true 是否存在任何冲突。

没有意义。事实上,通过设置unique=True 意味着不可能有两个用户拥有相同的fiscal_number,除非这两个用户是同一个用户。

unique_together = ['fiscal_year', 'email'] 表示fiscal_yearemail组合 必须是唯一的。这意味着不能有两个用户同时 fiscal_yearemail 相同(除非这两个用户是同一个用户)。但由于我们已经将fiscal_year 设为唯一字段,我们已经知道这不可能发生。

您也可以将email 字段标记为unique=True。这等同于unique_together = ['fiscal_number', 'email']。对于unique_together,两列的组合应该是唯一的,而在多个字段上设置unique=True,意味着所有Users都有一个不同的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 而不是抛出异常?

如何在 MySQL 中有一个涉及 ForeignKey 字段的 unique_together 约束?

django rest 框架:内容类型 unique_together 和序列化