【问题标题】:Query for only part of objects of related_name (from ForeignKey)仅查询related_name的部分对象(来自ForeignKey)
【发布时间】:2017-01-05 16:00:22
【问题描述】:

我要模型:

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

class Entry(models.Model):
    blog = models.ForeignKey(Blog,related_name='entries')
    headline = models.CharField(max_length=255)
    body_text = models.TextField()

我想获得 所有 博客,并且在每个博客中,我都会拥有标题为“自行车”的所有条目。 因此输出将是所有博客的列表,而 blog.entries 将具有过滤后的条目列表。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    你可以使用Prefetch:

    entries = Entry.objects.filter(headline='bike')
    blogs = Blog.objects.all().prefetch_related(Prefetch('entries', queryset=entries))
    

    【讨论】:

    • 相关名称是“entries”,而不是“entry_set”,这是一种非常复杂(而且效率不高)的方法来做一件非常简单的事情,cf e4c5's answer(这是显而易见的事情做)。
    • @brunodesthuilliers 再次感谢您!但是 OP 说他需要所有的博客。 Blog.objects.filter(entries__headline='bike') 不是只返回标题中带有“自行车”的 enries 吗?
    【解决方案2】:

    你可以做这个查询

     Blog.objects.filter(entries__headline='bike')
    

    它会在单个查询中检索具有标题为自行车条目的所有博客。所以在服务器上更容易看到 Spanning Multi Value Relationships

    【讨论】:

    • 这将过滤博客,我需要的是过滤与博客相关的条目,但它仍在博客中
    • “过滤与博客相关的条目”这正是它的作用。您可能是在谈论展示吗?你能详细说明一下吗
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2011-05-11
    • 2019-07-21
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多