【问题标题】:Django Queryset of related objects, after prefiltering on original model对原始模型进行预过滤后,相关对象的 Django Queryset
【发布时间】:2013-02-26 14:28:58
【问题描述】:

给定一个模型的查询集,我想获得另一个模型的查询集,该查询集与外键相关。以 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 的操作,并获得查询集延迟评估等的好处?

修改后的场景和解决方案

所以,我意识到我的问题的应用与我在上面提出的方式略有不同,因此 Daniel Roseman 的情况很有意义。我的情况真的更像author.entry_set.manager_method().blogs,其中manager_method() 返回一个Entry 对象的查询集。我接受了他的回答,因为它启发了我找到的解决方案:

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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    这样做的诀窍是要记住,如果你想要一个博客查询集,你应该从博客模型开始。然后,您可以使用双下划线语法来跟踪关系。所以:

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

    【讨论】:

    • 是的,这将是我最初提出的问题的一个很好的解决方案。事实证明,我的情况略有不同。不过,我接受了您的回答,因为它激发了我提出的解决方案,并将其编辑到我的问题中。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2018-09-14
    • 2016-01-15
    • 2010-09-20
    • 2019-02-14
    相关资源
    最近更新 更多