2012-04-18 32 views
10

He simplificado mis modelos para aclarar más lo que estoy tratando de hacer.Django: accediendo a muchos a muchos objetos a través de otra relación Muchos a Muchos

(models.py en aplicaciones de Equipos)

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 en los Documentos de aplicaciones)

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 

Lo que queremos lograr es conseguir una lista de usuarios que han están asociados con un Documento al obtener primero todos los equipos asociados con el documento y luego obtener todos los usuarios asociados con esos equipos.

Mis intentos hasta ahora han pasado algo como esto

(view.py en los Documentos de aplicaciones)

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 

    .... 

error: objeto 'QuerySet' no tiene atributo 'usuarios'

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

Error: objeto 'QuerySet' no tiene atributo 'usuarios'

associated_users = current_document.items.users.all() 

error: objeto 'ManyRelatedManager' no tiene 'usuarios' de atributos

¿Me voy de este por el camino equivocado?

Respuesta

13

Bueno, sí. current_document.teams.all() es un conjunto de preguntas - más o menos, una lista - de Equipos. No tiene sentido pedir current_document.teams.all().users, ya que un conjunto de consulta no tiene un atributo de "usuario", por lo tanto, el error. users es un atributo de cada elemento de equipo dentro de ese conjunto de consulta. Entonces, una forma de hacerlo sería iterar a través del conjunto de preguntas y preguntar por los usuarios asociados con cada equipo.

Sin embargo, eso sería irremediablemente ineficiente: una llamada de base de datos para cada equipo. Una forma mucho mejor es preguntar directamente a la base de datos: darme todos los usuarios que están en equipos asociados con el documento actual. De esta manera:

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

Todavía estoy confundido. la asociación de modelos de equipo con el modelo de documentos es de documentos a equipos, y no al revés (sé que este no es el enfoque más lógico, pero no puedo cambiar la estructura del modelo), entonces, ¿cómo puedo filtrar los documentos del equipo? – Finglish

+1

@agf 1. No, usted usa los nombres reales del modelo dentro de la expresión del filtro. 2. No, usas = para buscar un solo elemento dentro de una relación M2M/FK. Ver [búsquedas que abarcan relaciones] (https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships). –

+0

@Finglish puede acceder a las relaciones desde ambos lados. Ver el enlace que le di a agf. –

Cuestiones relacionadas