我可以在ManyToMany字段上使用unique_together吗?

时间:2018-10-18 04:29:25

标签: django

我有一个模型OrderPageSite有很多联系。在Django管理员中,我想限制站点的选择(属于现有Site的{​​{1}} s不能再次选择)。我可以用OrderPage吗?我在使用以下模型unique_together

时遇到错误
ManyToManyFields are not supported in unique_together

1 个答案:

答案 0 :(得分:1)

如果Site只能有一个OrderPage,则不必担心unique_together。

理想情况下,您应该继承Site的子类,然后使用其中的ForeignKeyOrderPage。这将自然地为您提供所需的内容:每个站点都可以有一个OrderPage,而每个OrderPage可以有多个站点。这将是最干净的方法,但是您必须在整个程序中使用子类来代替原始的Site,这可能比您现在想要的工作还要多。

class BetterSite(Site):
    order_page = models.ForeignKey('OrderPage')

更脏的方法是保留M2M并仅将site设置为唯一,因为M2M表中的每个站点上都应该只有一个条目。您将使用“通过”表,以便设置自定义唯一性值:

class OrderPage(models.Model):
    description = models.CharField(max_length=255, blank=False)
    sites = models.ManyToManyField(Site, through='OrderPageToSite')

class OrderPageToSite(models.Model):
    order_page = models.ForeignKey(OrderPage)
    site = models.ForeignKey(Site, unique=True)

(请注意,我已经将这些简单了,但是在FK字段中,您还应该考虑设置on_deleterelated_name