首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在unique_together字段上使用ManyToMany吗?

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

Stack Overflow用户
提问于 2018-10-18 04:29:25
回答 1查看 2.5K关注 0票数 2

我有一个OrderPage模型,它对Site来说是多方面的。在Django管理中,我希望限制站点的选择(属于现有SiteOrderPage不能再次被选中)。我能用unique_together做吗?下面的ManyToManyFields are not supported in unique_together模型出错了

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-18 05:15:29

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

理想情况下,您应该将Site子类并将ForeignKey从该子类使用到OrderPage。这将为您提供您想要的东西:每个站点都可以有一个OrderPage,每个OrderPage可以有多个站点。这将是最干净的,但是您必须在整个程序中使用您的子类来代替原来的Site,这可能比您现在想要的工作量更多。

代码语言:javascript
运行
复制
class BetterSite(Site):
    order_page = models.ForeignKey('OrderPage')

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

代码语言:javascript
运行
复制
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)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52867051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档