我正在尝试将一个条件唯一约束设置为我的一个模型字段(db透视图上的列)相对于另一个布尔字段但无法找到方法来执行此操作。
我正在创建一个网络管理工具,以帮助/控制客户出勤,基于编号的卡片,当他们仍在商店时。 我的主要目标是阻止我的用户保存卡号,而此号码仍然有效(又名布尔字段)与另一位客户。<登记/> 在models.py上这样的东西:
class Cards(models.Model):
card_number = models.PositiveIntegerField("""{{RESTRICTION NEEDED}}""")
card_date = models.DateTimeField(auto_now=False, auto_now_add=True)
custumer = models.ForeignKey(Customer)
status = models.BooleanField(default=False)
也许像这样的东西可以直接在postgres上运行,但还没有尝试过
CREATE UNIQUE INDEX card_number_ind ON Cards (card_number) WHERE (status is False);
有机会直接使用Django吗?我的意思是在Django上设置一个关于布尔字段(状态)的条件唯一约束?
TIA
Obs.This是我在stackoverflow上的第一个问题,随意批评风格。
答案 0 :(得分:2)
Django不支持在models.py中定义条件约束,但是您可以创建一个迁移来添加这样的约束。
首先创建一个空迁移
./manage.py makemigrations appname --empty
这将创建一个空的迁移文件。接下来,您需要将自定义约束添加到迁移
class Migration(migrations.Migration):
...
operations = [
migrations.RunSQL('create unique index card_number_ind on cards (card_number) where (status is false)'),
]
答案 1 :(得分:2)
从Django 2.2开始,现在有一个UniqueConstraint
声明,其中有一个condition
选项。
条件
唯一约束条件
Q 对象,用于指定您希望约束强制执行的条件。
例如:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
确保每个用户只有一个草稿。