Подтвердить что ты не робот

Django: доступ к объектам Many to Many через другое отношение Many to Many

Я упростил свои модели, чтобы сделать его более ясным, что я пытаюсь сделать.

(models.py в командах приложений)

 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 в приложении 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

То, что я хочу достичь, - это получить список пользователей, связанных с документом, сначала получив все команды, связанные с документом, а затем из этого получив всех пользователей, связанных с этими командами.

Мои попытки пока что-то вроде этого

(view.py в приложении Documents)

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

    ....

Ошибка: Объект QuerySet не имеет атрибутов 'users'

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

Ошибка: Объект QuerySet не имеет атрибутов 'users'

associated_users = current_document.items.users.all()

Ошибка: Объект ManyRelatedManager не имеет атрибутов 'users'

Неужели я ошибаюсь?

4b9b3361

Ответ 1

Ну да. current_document.teams.all() - это набор запросов - более или менее - список команд. Не имеет смысла запрашивать current_document.teams.all().users, поскольку набор запросов сам по себе не имеет атрибута 'users', следовательно, является ошибкой. users - это атрибут каждого элемента команды внутри этого набора запросов. Таким образом, одним из способов сделать это было бы выполнить итерацию через запрос и спросить пользователей, связанных с каждой командой.

Однако это было бы безнадежно неэффективным - один запрос базы данных для каждой команды. Лучше всего спросить базу данных напрямую: дайте мне всех пользователей, которые находятся в командах, связанных с текущим документом. Вот так:

User.objects.filter(team__documents=current_document)