2012-04-18 42 views
10

Tôi đã đơn giản hóa các mô hình của mình xuống để làm cho nó rõ ràng hơn những gì tôi đang cố gắng làm.Django: Truy cập nhiều đối tượng Nhiều thông qua mối quan hệ Nhiều đến Nhiều

(models.py trong ứng dụng của Đội)

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 trong Tài liệu ứng dụng)

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 

Những gì tôi muốn đạt được là nhận được một danh sách người dùng đã được gắn liền với một tài liệu bằng cách đầu tiên nhận được tất cả các đội liên kết với tài liệu và sau đó từ việc này nhận được tất cả những người dùng liên kết với các đội đó.

nỗ lực của tôi cho đến nay đã đi một cái gì đó giống như

(view.py trong Tài liệu ứng dụng) này

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 

    .... 

Lỗi: đối tượng 'QuerySet' không có thuộc tính của người sử dụng '

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

Lỗi: đối tượng 'QuerySet' không có thuộc tính 'người dùng'

associated_users = current_document.items.users.all() 

Lỗi: đối tượng 'ManyRelatedManager' không có thuộc tính của người sử dụng '

Tôi đi về việc này một cách sai lầm?

Trả lời

13

Vâng, vâng. current_document.teams.all() là một queryset - nhiều hơn hoặc ít hơn, một danh sách - của Teams. Nó không có ý nghĩa để yêu cầu current_document.teams.all().users, vì một queryset không tự nó có thuộc tính 'users', do đó là lỗi. users là thuộc tính của từng thành phần Nhóm trong số truy vấn đó. Vì vậy, một cách để thực hiện nó là lặp lại thông qua queryset và yêu cầu người dùng liên kết với mỗi nhóm.

Tuy nhiên, điều đó sẽ vô vọng không hiệu quả - một cuộc gọi cơ sở dữ liệu cho mỗi nhóm. Một cách tốt hơn là hỏi trực tiếp cơ sở dữ liệu: cung cấp cho tôi tất cả người dùng trong nhóm được liên kết với tài liệu hiện tại. Như thế này:

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

Tôi vẫn còn bối rối. các mô hình Nhóm liên kết với mô hình Tài liệu là từ các tài liệu đến nhóm chứ không phải theo cách khác, (Tôi biết đây không phải là cách tiếp cận hợp lý nhất, nhưng tôi không được phép thay đổi cấu trúc mô hình), vậy làm cách nào tôi có thể lọc team__documents? – Finglish

+1

@agf 1. Không, bạn sử dụng tên mẫu thực tế bên trong biểu thức lọc. 2. Không, bạn sử dụng = để tìm kiếm một phần tử duy nhất trong mối quan hệ M2M/FK. Xem [tra cứu mở rộng mối quan hệ] (https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships). –

+0

@Finglish bạn có thể truy cập các mối quan hệ từ cả hai phía. Xem liên kết tôi đã cho agf. –

Các vấn đề liên quan