2010-03-15 12 views
6

Hay Ich habe eine Frage über Beziehungen.django ManyToMany durch Hilfe

Ich möchte Benutzer zu Freundschaften haben. So kann ein Benutzer ein Freund mit einem anderen Benutzer sein. Ich gehe davon aus, dass ich das ManyToManyField über eine Friendship-Tabelle verwenden muss. Aber ich kann es nicht zur Arbeit bringen. Irgendwelche Ideen?

Hier sind meine Modelle.

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 
    pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

class PendingFriendship(models.Model): 
    user = models.ForeignKey('User', related_name='user') 
    requested_friend = models.ForeignKey('User', related_name='requested_friend') 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 

Dank

Antwort

6

Many-to-many-Feld in der documentation beschrieben. Just do:

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 

Sie nur through verwenden, wenn Sie zusätzliche Felder die Beziehung hinzufügen mögen. Eine weitere Beschreibung aller Möglichkeiten ist in this section beschrieben.

Da Sie Ihr Modell Benutzer nennen, nehme ich an, dass Sie nicht das integrierte Authentifizierungsframework verwenden. Aber wenn Sie es verwenden, müssen Sie die Authentifizierung nicht selbst implementieren, also denken Sie darüber nach.

Aktualisierung: Haben Sie die Abschnitte gelesen, die ich verlinkt habe? Es wird beschrieben:

einige Beschränkungen des Zwischenmodell Es gibt:

  • Ihr Zwischenmodell ein enthalten muss - und nur eine - Fremdschlüssel für das Zielmodell (dies wäre Person in unser Beispiel). Wenn Sie mehr als einen Fremdschlüssel haben, wird ein Validierungsfehler ausgelöst.
  • Ihr Zwischenmodell muss einen - und nur einen - Fremdschlüssel für das Quellmodell enthalten (in unserem Beispiel wäre dies die Gruppe). Wenn Sie mehr als einen Fremdschlüssel haben, wird ein Validierungsfehler ausgelöst.
  • Die einzige Ausnahme ist ein Modell, das über ein intermediäres Modell eine Viele-zu-Viele-Beziehung zu sich selbst hat. In diesem Fall sind zwei Fremdschlüssel für dasselbe Modell zulässig, sie werden jedoch als zwei (verschiedene) Seiten der Viele-zu-Viele-Beziehung behandelt.
  • Wenn Sie eine Viele-zu-Viele-Beziehung von einem Modell zu sich selbst definieren und ein Zwischenmodell verwenden, müssen Sie symmetrical=False verwenden (siehe model field reference).
+0

Ich habe das Beispiel aktualisiert, mit Ihrer Änderung. Allerdings brauche ich immer noch die zusätzliche Tabelle, um Daten zu halten. – dotty

+0

@dotty: Ich habe meine Antwort aktualisiert. –

+1

hmm, ive hat mein Modell aktualisiert, die Validierung ist in Ordnung. Ich habe ein paar Benutzer hinzugefügt. und erstellt ein PendingFriendship-Objekt auf dem Modell von Benutzer A.Dies fügt die Freundschaft gut hinzu, aber das Objekt von Benutzer b erhält nicht die andere Seite der Freundschaft (ich nehme an, weil der 'symmetrische' Wert falsch ist). Ich möchte aber, dass die Beziehung symmetrisch ist. irgendwelche Ideen? – dotty

0

This blog erklärt, was Sie brauchen. Aus dem Blog, müssen Sie einfach related_name in dieser Zeile:

pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

in:

related_name='friend_requested+' 

Aber ich kann immer noch nicht bekommen es die symmetrische Beziehung zu arbeiten, automatisch zu erstellen.

Verwandte Themen