Ich erstelle eine Personengruppe und Mitgliedschaft wie in Django Docs für Zwischenmodell beschrieben.Zugriff Felder in Django Zwischenmodell
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Es ist möglich, die Person aus einer Gruppe Objekt zuzugreifen mit:
>>>Group.members.name
Does Django erzeugt eine weitere Abfrage, um die Person zu holen? Kann ich über ein Gruppenobjekt auf das Feld date_joined
zugreifen?
Was ich verwirrt bin, dass ich mit der Person Namensfeld zu erhalten erwarten würde:
>>>Group.members.person.name
Was passiert, wenn eine Person ein Feld ‚Namen‘ hat und auch das Zwischenmodell ein Feld ‚Namen haben ".
Was Sie sagen, ist absolut sinnvoll und passen, wie ich Modelle in django verstehen. Was mich verwirrte, war django docs über das Modell von intermedaite unter http://docs.djangoproject.com/en/1.0/topics/db/models/#extra-fields-on-many-to-many-relationships Sie zeigen dieses Beispiel mit die gleichen Modelle oben: # Finden Sie alle Gruppen mit einem Mitglied, dessen Name mit 'Paul' beginnt >>> Group.objects.filter (members__name__startswith = 'Paul') [] Ich würde erwarten es zu sein: >>> Group.objects.filter (members__person__name__startswith = 'Paul') –
pablo
Es ist "Group.objects.filter (members__name__startswith = 'Paul')" weil Mitglieder ein Manager ist. Sie müssen sicherstellen, dass Sie verstehen, dass Member kein Mitgliedschaftsobjekt, sondern ein ManyRelatedManager-Objekt ist. Ich denke, es könnte Ihnen helfen, wenn Sie mehr darüber lesen, was Manager genau sind. P.S.Wenn Sie in einem Projekt mit diesen Modellen "python manage.py shell" eingeben, können Sie versuchen, "Group.objects.filter (members__person__name__startswith = 'Paul')" einzufügen und zu sehen, was passiert - vielleicht hilft Ihnen das? –
Ich verstehe, dass Mitglieder ein Manager ist und ich über Manager gelesen habe. Ich verstehe nicht, wie Mitglieder beschließen, den Namen für Person und nicht für Gruppe zu verwenden. Beide haben dieses Feld. Es ist auch möglich, dass die Mitgliedschaft einen Feldnamen hat. Ich würde das filtern? – pablo