2016-06-06 7 views
2

Ich habe Probleme, die Verwendung von ManyToMany-Modellfeldern mit einem Durchgangsmodell zu verstehen. Ich kann das gleiche ohne das ManyToMany Feld leicht erreichen. Die folgend von Django docs BerücksichtigungManyToMany-Felder in Django mit einem Durchgangsmodell verstehen

class Person(models.Model): 
    name = models.CharField(max_length=128) 


class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 


class Membership(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, on_delete=models.CASCADE) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

Was ich nicht verstehe, ist, wie wird mit dem ManyToMany Feld besser als einfach fallen zu lassen und die damit verbundenen Manager. Zum Beispiel ändern sich die beiden Modelle zu den folgenden:

class Group(models.Model): 
    name = models.CharField(max_length=128) 


class Membership(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='members') 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

Was fehlt mir hier?

Antwort

5

Ja, mit einer expliziten through Tabelle im Grunde beseitigt die Notwendigkeit für eine ManyToManyField.

Der einzige wirkliche Vorteil ist, wenn Sie den zugehörigen Manager bequem finden. Das heißt, dieses:

group.members.all() # Persons in the group 

sieht schöner als das:

Person.objects.filter(membership_set__group=group) # Persons in the group 

In der Praxis, ich glaube, der Hauptgrund, sowohl für die ist, dass die Menschen oft mit einem einfachen ManyToManyField beginnen; erkennen Sie, dass sie einige zusätzliche Daten benötigen und fügen Sie eine through Tabelle hinzu; und dann beide wegen Code, der beide Manager verwendet.

+0

Ausgezeichnet danke. Es hängt also von der Präferenz ab, welche ich benutze? – Johan

+0

@Johan: Das stimmt, es hängt nur davon ab, welche Art von Abfragen Sie ausführen möchten und wie Sie sie in der Sprache des ORM ausdrücken möchten. Persönlich tendiere ich dazu, das "ManyToManyField" hinzuzufügen, nur für den Fall, dass es immer bequem ist, diesen Manager zu verwenden. –

+0

Darüber hinaus garantiert m2m Beziehung mit durchgarden die Einheitlichkeit der Beziehung. Im Frage-Beispiel verhindert nichts, 2 Mitgliedschaften mit gleichen Personen-/Gruppenreferenzen zu haben – Antwane