django postgres条件约束

时间:2016-02-03 20:34:59

标签: python django postgresql

我正在尝试将一个条件唯一约束设置为我的一个模型字段(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上的第一个问题,随意批评风格。

2 个答案:

答案 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')

确保每个用户只有一个草稿。