给定一个模型的查询集,我想获得另一个与外键相关的模型的查询集。以 Django 项目文档的 weblog 模式为例:
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的对象方法,返回上述内容。