Die Antwort auf die Frage Django admin ManyToMany inline "has no ForeignKey to" error bezieht sich auf die Django Admin Dokumentation. Die Modelle gegeben sind:Django Admin viele-zu-viele umgekehrt?
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')
und die Inline-Admin-Klassen sind:
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
class GroupAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('members',)
... die Gruppenmitgliedschaft ermöglicht von der Person Seite verwaltet werden, aber nicht von der Seite Gruppe. Was aber, wenn der Administrator nur Mitglieder von der Gruppenseite aus verwalten möchte? Wenn Sie die Zeile exclude
loswerden, können beide Seiten die Beziehung verwalten, aber die Django-Dokumentation (wahrscheinlich falsch) sagt: "Sie müssen dem Django-Administrator mitteilen, dass er dieses Widget nicht anzeigen soll". Was sie wahrscheinlich meinen, ist, dass du Djangos Admin "sagen" solltest, es nicht anzuzeigen - nichts Schlimmes wird passieren, wenn du es nicht tust, aber es ist überflüssig.
Ohne die Modelle zu ändern, ist es also möglich, das Mitgliedswidget von der Personenseite auszuschließen, anstatt von der Gruppenseite? Beide offensichtliche Versuche:
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('Group.members',)
und
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('groups',)
(der zweite die related_name
vom Modell) nicht mit dem Fehler:
'PersonAdmin.exclude' refers to field 'groups' that is missing from the form.
Ja, das Modell geändert werden könnte zu setzen die ManyToManyField
unter Person
. Da es sich jedoch um eine symmetrische Beziehung handelt, gibt es keinen logischen Grund, warum sie nicht von Person oder Gruppe (aber nicht von beiden) verwaltet werden könnte, ohne das Datenbankschema ändern zu müssen. Kann Django Admin die Gruppenmitgliedschaft von der Gruppenseite aus verwalten und von der Personenseite ausschließen?
Natürlich könnte ich das Schema neu definieren und die Datenbank migrieren, wie in der ursprünglichen Frage bestätigt. Es gibt keinen inhärenten technischen Grund dafür, dass die Admin-Schnittstelle zulässt, dass eine symmetrische Beziehung von einem Ende verwaltet wird, aber nicht von dem anderen - man sollte * entweder die Gruppen eines Mitglieds oder die Mitgliederliste einer Gruppe verwalten können wo die Beziehung definiert ist.Sie haben lediglich die dokumentierte Einschränkung neu formuliert und keine Begründung für ihre Existenz geliefert. – Dave