2013-02-26 55 views
8

给定一个模型的查询集,我想获取由外键相关的另一个模型的查询集。就拿Django项目文档博客模式:相关对象的Django Queryset,在对原始模型进行预过滤后

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 

假设我有一个author对象,我想每一个博客,作者已经书面,作为查询集。我做了一些像author_blogs = [entry.blog for entry in author.entry_set]。但在这种情况下,我留下了一个列表,而不是查询集。有没有办法可以直接使用ORM查询来完成此任务,所以我可以通过use_for_related_fields = True的自定义条目管理器进行设置,并执行类似author_blogs = author.entry_set.blogs的操作,并获得查询集延迟评估等的好处?

编辑场景和解决方案

所以,我的事实,我的问题的应用程序是比我如何提出它上面,为此,丹尼尔·罗斯曼的情况使得有很大的意义略有不同后实现。我的情况更像author.entry_set.manager_method().blogs,其中manager_method()返回Entry对象的查询集。我接受了他的答案,因为它激发了我发现的解决方案:

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

好的是它只使用一个数据库查询。这有点棘手和冗长,所以我认为最好将blogs()定义为Author的对象方法,返回上述内容。

回答

17

这个技巧是要记住,如果你想要一个博客的查询集,你应该从博客模型开始。然后,可以使用双下划线语法来遵循关系。所以:

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

是的,这将是一个很好的解决方案,正如我最初提出的那样。事实证明,我的情况稍有不同。尽管我接受了你的回答,因为它激发了我提出的解决方案,我编辑了我的问题。谢谢。 – acjay 2013-02-26 15:34:14

相关问题