我有一个OrderPage
模型,它对Site
来说是多方面的。在Django管理中,我希望限制站点的选择(属于现有Site
的OrderPage
不能再次被选中)。我能用unique_together
做吗?下面的ManyToManyFields are not supported in unique_together
模型出错了
class OrderPage(models.Model):
description = models.CharField(max_length=255, blank=False)
sites = models.ManyToManyField(Site)
class Meta:
unique_together = (('id', 'sites'),)
class Order(models.Model):
order_page = models.ForeignKey(OrderPage)
class OrderPageAdmin(admin.ModelAdmin):
filter_horizontal = ('sites',)
admin.site.register(OrderPage, OrderPageAdmin)
发布于 2018-10-17 21:15:29
如果Site
只能有一个OrderPage
,则不需要担心unique_together。
理想情况下,您应该将Site
子类并将ForeignKey
从该子类使用到OrderPage
。这将为您提供您想要的东西:每个站点都可以有一个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_delete
和related_name
)
https://stackoverflow.com/questions/52867051
复制