在多对一关系中强制父级具有字段唯一性

时间:2019-05-28 00:54:26

标签: django django-models

我有一个Table模型,它与Restaurant模型是多对一的。是否有一种方法可以在reference_label模型中拥有一个字段Table,该字段必须每个餐厅是唯一的,但不能在不同的餐厅之间?

简而言之,我想对具有相同外键的表强制执行reference_label唯一性。

我知道我可以只使用Table的{​​{1}},但是我希望每家餐厅都能够自定义他们如何标记餐桌。

2 个答案:

答案 0 :(得分:2)

如果您使用的是Django 2.2,则可以使用UniqueConstraint代替unique_together,如下所示:

class Meta:
    constraints = [
        models.UniqueConstraint(fields=['restaurant', 'reference_label'], name='give_it_some_name')
    ]

作为docs状态:

  

改为将UniqueConstraint与constraints选项一起使用。

     

UniqueConstraint提供的功能比unique_together还要多。将来可能不推荐使用unique_together。

答案 1 :(得分:1)

您可以使用unique_together

class Restaurant(models.Model):
    ...

class Table(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    reference_label = models.CharField(max_length=20)
    ...
    class Meta:
        unique_together = ['restaurant', 'reference_label']