2013-02-26 33 views
8

Cho một truy vấn cho một mô hình, tôi muốn nhận một bộ truy vấn của một mô hình khác có liên quan bằng khóa ngoài. Lấy schema weblog Django tài liệu dự án:Django Truy vấn các đối tượng liên quan, sau khi lọc trước trên mô hình gốc

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Author(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    pub_date = models.DateField() 
    mod_date = models.DateField() 
    authors = models.ManyToManyField(Author) 
    n_comments = models.IntegerField() 
    n_pingbacks = models.IntegerField() 
    rating = models.IntegerField() 

    def __unicode__(self): 
     return self.headline 

Giả sử tôi có một đối tượng author, và tôi muốn để có được tất cả các blog của tác giả đã viết cho, như một queryset. Tôi làm một cái gì đó như author_blogs = [entry.blog for entry in author.entry_set]. Nhưng tôi còn lại với một danh sách trong trường hợp này, không phải là một queryset. Có cách nào tôi có thể làm điều này trực tiếp với các truy vấn ORM, vì vậy tôi có thể thiết lập nó thông qua một trình quản lý mục nhập tùy chỉnh với use_for_related_fields = True và làm một cái gì đó như author_blogs = author.entry_set.blogs và nhận được lợi ích của việc đánh giá chậm, v.v ..., của một queryset?

kịch bản biên soạn và giải pháp

Vì vậy, tôi nhận ra sau khi thực tế là việc áp dụng các câu hỏi của tôi là hơi khác so với làm thế nào tôi đặt ra nó ở trên, mà tình hình Daniel Roseman của làm cho rất nhiều ý nghĩa. Tình hình của tôi thực sự giống như author.entry_set.manager_method().blogs, trong đó manager_method() trả về một queryset của các đối tượng Entry. Tôi đã chấp nhận câu trả lời của mình vì nó đã truyền cảm hứng cho giải pháp mà tôi đã tìm thấy:

author_blogs = Blog.objects.filter(entry__in=author.entry_set.manager_method()) 

Điều tuyệt vời là nó chỉ sử dụng một truy vấn DB. Đó là một chút khó khăn và tiết, vì vậy tôi nghĩ rằng tốt nhất để xác định blogs() như là một phương pháp đối tượng của tác giả, trả lại ở trên.

Trả lời

17

Bí quyết cho điều này là hãy nhớ rằng nếu bạn muốn có một bộ truy vấn Nhật ký điện tử, bạn nên bắt đầu với mô hình Blog. Sau đó, bạn có thể sử dụng cú pháp đôi gạch dưới để theo dõi các mối quan hệ. Vì vậy:

author_blogs = Blog.objects.filter(entry__authors=author) 
+0

Vâng, đó sẽ là một giải pháp tuyệt vời cho câu hỏi như ban đầu tôi đã đặt ra. Khi nó quay ra, tình hình của tôi hơi khác một chút. Tôi chấp nhận câu trả lời của bạn mặc dù, bởi vì nó truyền cảm hứng cho giải pháp mà tôi đã đưa ra, mà tôi đã chỉnh sửa trong câu hỏi của mình. Cảm ơn. – acjay

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