问题Django admin ManyToMany inline "has no ForeignKey to" error的答案是指Django文档。鉴于那里的车型有:Django管理员多对多颠倒?
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, related_name='groups')
和在线管理类:
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
class GroupAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('members',)
...允许组成员从个人页面从组页面进行管理,但没有。但是如果管理员只想从组页面管理成员呢?摆脱exclude
行将允许两个页面管理关系,但Django文档(可能不正确)说“你必须告诉Django的管理员不要显示这个小部件”。他们可能意味着你“应该”告诉Django的管理员不要显示它 - 如果你不这样做会有什么不好的,但这是多余的。
因此,在不更改模型的情况下,是否可以从Person页面而不是从Group页面中排除会员窗口小部件?这两个明显的尝试:
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('Group.members',)
和
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('groups',)
(第二使用从模型中related_name
)失败,出现错误:
'PersonAdmin.exclude' refers to field 'groups' that is missing from the form.
是,该模型可以改变放Person
下的ManyToManyField
。但是由于它是一种对称关系,没有逻辑上的原因,为什么它不能从Person或Group(而不是两个)进行管理,而无需更改数据库模式。 Django Admin是否可以通过组页面管理组成员身份并将其从个人页面中排除?
当然,我可以重新定义模式并迁移数据库,如原始问题中所述。管理界面没有固有的技术理由允许从一端管理对称关系,而不是从另一端管理对等关系 - 一个*应该*能够管理成员所属的组或成员列表,无论定义关系的地方。你只是重申了记录的限制,没有提供它的存在的理由。 – Dave