我的模型定义如下:
class Group(models.Model):
name = models.CharField(max_length=30)
countries = models.ManyToManyField(Country)
我需要防止通过Django Admin将国家/地区分配给多个组。
我该如何实现?
我意识到我可以将group = models.ForeignKey
放置在我的Country
模型上,而不是ManyToMany关系,但这将改变在Django Admin上进行编辑的方式。
答案 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
的解决方案都会有性能损失,因为还有一个附加表要联接。还请注意,此更改涉及潜在的复杂迁移;您可以找到有关如何做到这一点的问题和答案。