2012-04-18 15 views
10

Ich habe meine Modelle vereinfacht, um klarer zu machen, was ich versuche zu tun.Django: Zugriff auf viele zu viele Objekte durch eine andere Viele zu viele Beziehung

(models.py in App Teams)

from django.db import models 
from django.contrib.auth.models import User 
import datetime 

class Team(models.Model): 
    users = models.ManyToManyField(User) 
    team_title = models.CharField(max_length=200) 
    team_description = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.team_title 

(models.py in App Documents)

from django.db import models 
import datetime 

class Document(models.Model):  
    teams = models.ManyToManyField("Teams.Team", blank=True) 
    document_title = models.CharField(max_length=200) 
    document_description = models.TextField() 

def __unicode__(self): 
    return self.document_title 

Was ich will, eine Liste von Benutzern zu erreichen, wird immer die mit zugeordnet haben ein Dokument, indem zuerst alle mit dem Dokument verknüpften Teams abgerufen und anschließend alle mit diesen Teams verbundenen Benutzer abgerufen werden.

Meine bisherigen Versuche haben so etwas wie dieses

(view.py in App Documents) gegangen

from django.contrib.auth.models import User 
from Documents.models import * 
from Teams.models import * 

def docUsers(request, doc_id): 
    current_document = Documents.objects.get(pk = doc_id) 
    associated_users = current_document.teams.all().users 

    .... 

Fehler: 'QuerySet' Objekt hat kein Attribut

associated_users = current_document.items.all().users.all() 
'users'

Fehler: 'QuerySet' Objekt hat kein Attribut 'Benutzer'

associated_users = current_document.items.users.all() 

Fehler: 'ManyRelatedManager' Objekt hat kein Attribut 'users'

Bin ich über diese gehen in die falsche Richtung?

Antwort

13

Nun, ja. current_document.teams.all() ist ein Abfrage-Set - mehr oder weniger, eine Liste - von Teams. Es macht keinen Sinn, nach current_document.teams.all().users zu fragen, da ein Abfrage-Set selbst kein Attribut 'Benutzer' hat, daher der Fehler. users ist ein Attribut jedes Team-Elements innerhalb dieses Abfrage-Set. Eine Möglichkeit besteht darin, das Abfrage-Set zu durchlaufen und nach den Benutzern zu fragen, die mit jedem Team verbunden sind.

Allerdings wäre das hoffnungslos ineffizient - ein Datenbankaufruf für jedes Team. Ein viel besserer Weg ist, die Datenbank direkt zu fragen: geben Sie mir alle Benutzer, die in Teams sind, die mit dem aktuellen Dokument verbunden sind. Wie folgt:

User.objects.filter(team__documents=current_document) 
+1

Ich bin immer noch verwirrt. Die Zuordnung der Team-Modelle zum Documents-Modell erfolgt von Dokumenten zu Team, nicht umgekehrt (ich weiß, dass dies nicht der logischste Ansatz ist, aber ich darf die Modellstruktur nicht ändern). Wie kann ich Team__Dokumente filtern? – Finglish

+1

@agf 1. Nein, Sie verwenden die tatsächlichen Modellnamen innerhalb des Filterausdrucks. 2. Nein, Sie verwenden = um ein einzelnes Element innerhalb einer M2M/FK-Beziehung nachzuschlagen. Siehe [Suchvorgänge, die Beziehungen überspannen] (https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships). –

+0

@Finglish können Sie auf Beziehungen von beiden Seiten zugreifen. Siehe den Link, den ich Agf gegeben habe. –