允许一次由一个对象选择ManyToMany中的选项

时间:2019-03-03 15:05:16

标签: django django-models django-admin

我的模型定义如下:

class Group(models.Model):
    name = models.CharField(max_length=30)
    countries = models.ManyToManyField(Country)

我需要防止通过Django Admin将国家/地区分配给多个组。

我该如何实现?

我意识到我可以将group = models.ForeignKey放置在我的Country模型上,而不是ManyToMany关系,但这将改变在Django Admin上进行编辑的方式。

1 个答案:

答案 0 :(得分:1)

我的强烈建议是让您的数据库结构准确地反映您的数据模型,而不是将其建立在Django中产生最方便的默认表单的基础上。定制表单并不难,但很难避免,容忍数据损坏也很危险。例如,如果您按照建议执行操作,则不会采取任何措施来防止通过其他方式(视图,控制台等)创建无效数据

因此,一种选择是按照您的建议使用ForeignKey约束。

一个折衷的解决方案是保留ManyToManyField并将相关约束施加到through模型上。这样一来,您就可以继续使用当前使用的任何表格。像这样:

class Group(models.Model):
    name = models.CharField(max_length=30)
    countries = models.ManyToManyField(Country, through="GroupCountry")

class GroupCountry(models.Model):
    group = models.ForeignKey(Group)
    country = models.ForeignKey(Country, unique=True)

请注意,任何涉及ManyToManyField的解决方案都会有性能损失,因为还有一个附加表要联接。还请注意,此更改涉及潜在的复杂迁移;您可以找到有关如何做到这一点的问题和答案。