如何只允许一行具有特定的字段值?

时间:2016-04-29 19:01:43

标签: django database-design

在我的Django模型中,只有一个值可以是主要值,而其余值是可选的。

在我的模特中:

@with_author 
class BOMVersion(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    tomaterial =  models.ForeignKey(Material, related_name = 'tomaterial')

    status  = models.CharField(max_length=1, choices=STATUS_CHOICES)

BOM_CHOICES = (
    ('M','Main'),
    ('A','Additional'),
)

我应该能够用这样的数据填充这个模型,这样只有一行' status将具有 Main 的值,而其余的将始终为 Additional 。 (当只能选择值时,它完全是单选按钮功能。)

例如:

1 v1 ...A
2 v2 ...M
3 v3 ...A
.........
n vn ...A

我提出了一个解决方法,其中添加的所有值将始终是附加的,并且将具有带单选按钮的单独UI,其中用户将选择应该是主要值的值。

但是想知道有没有办法直接将这个逻辑应用于Django模型?

1 个答案:

答案 0 :(得分:2)

如果您的数据库支持它,partial unique index是一个很好的方法。在PostgreSQL中,它看起来像这样:

CREATE UNIQUE INDEX bom_constraint ON appname_bomversion (status) WHERE status = 'M';

从版本2.2开始,Django支持declarative partial unique indexes。在旧版本中,您需要使用迁移。有关详细信息,请参阅this answer