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'
Неужели я ошибаюсь?
Ответы
Ответ 1
Ну да. current_document.teams.all()
- это набор запросов - более или менее - список команд. Не имеет смысла запрашивать current_document.teams.all().users
, поскольку набор запросов сам по себе не имеет атрибута 'users', следовательно, является ошибкой. users
- это атрибут каждого элемента команды внутри этого набора запросов. Таким образом, одним из способов сделать это было бы выполнить итерацию через запрос и спросить пользователей, связанных с каждой командой.
Однако это было бы безнадежно неэффективным - один запрос базы данных для каждой команды. Лучше всего спросить базу данных напрямую: дайте мне всех пользователей, которые находятся в командах, связанных с текущим документом. Вот так:
User.objects.filter(team__documents=current_document)