【发布时间】:2019-11-01 15:29:52
【问题描述】:
考虑以下 Django 模型:
class Account(models.Model):
ACCOUNT_CHOICES = [
('m', 'Main',),
('s','Secondary'),
('o', 'Other')
]
user = models.ForeignKey(User)
level = models.CharField(max_length=1, choices=ACCOUNT_CHOICES)
如何强制每个用户最多拥有一个“主”帐户的数据库约束,同时仍允许用户拥有任意数量的“辅助”或“其他”帐户?从某种意义上说,我想要unique_together 对应user 和level,但前提是level 的值为m。
我知道我可以手动检查是否保存,但我希望数据库自动检查并在适当时提出IntegrityError。
【问题讨论】:
-
我不认为你可以用你当前的模型做到这一点,但如果这些是
level的唯一选择,请考虑将其更改为可空的BooleanField,例如is_main = models.BooleanField(null=True)并设置将其发送至None用于辅助帐户。然后unique_together将起作用,因为 SQL 将忽略空值。 -
@Selcuk 他们不是唯一的选择,所以我会更新这个问题。但是,如果我按照您的描述添加第三个字段,您的解决方案将起作用
-
如果您使用的是 postgres,您可以使用部分唯一索引 sqlfiddle.com/#!17/c5441b/1 执行此操作 - 这是一个 sqlfiddle - 如果这是您要查找的内容,请告诉我,我会创建一个答案@ZG101
-
@Trent 感谢您的建议。但是,我宁愿坚持使用 Django ORM 也适用于其他数据库
-
@Trent 恕我直言,您仍然应该将其发布为帮助未来访问者的答案。
标签: django