【问题标题】:Django Querysets: using select_related to return objects from a set of foreign keysDjango Querysets:使用 select_related 从一组外键返回对象
【发布时间】:2018-01-28 01:32:54
【问题描述】:

我有一个 ArticlePage 模型,它有一个 City 模型的外键,我想有效地使用 QuerySet 来获取一组模型。City 包含所有已被 ArticlePage 引用的 City 实例。

class ArticlePage(Page):
    #...
    city = models.ForeignKey(City, on_delete=models.PROTECT, null=True)
    #...

然后在一个视图中:

qs = ArticlePage.objects.filter(city__isnull=False).filter(city__name__icontains=self.q).select_related('city')

所以我尝试了上述查询的多种排列方式,但都没有返回所需的结果。所有结果都是一组 ArticlePage 类型而不是 City。

我想要做的只是返回一组 City 类型的结果,其中包含 ArticlePage 引用的每个 City 对象,但我要疯狂地尝试使用 django 查询集来实现这一点,而且我当然我只是在做一些非常愚蠢的事情。在这里感谢任何建议。

【问题讨论】:

  • 我不确定我是否完全理解你想要什么,但如果你想要City 实例,为什么要查询ArticlePage 而不是City
  • 如果您同意,我建议将问题重命名为其他人更容易搜索的内容并编辑第一句。我相信应该仍然有类似(或重复)的问题,但没有一个很容易找到,您的问题可能会有用。
  • 在下面回答,我已经更新了标题和第一句话,希望它更易于搜索,如果可以更好地表达,请告诉我。

标签: django django-queryset


【解决方案1】:

select-related,只是缓存了相关对象,如果你需要City的查询集,你需要重写你的qs,类似于:

qs_a = ArticlePage.objects.filter(city__isnull=False).values_list('city__pk', flat=True)
qs = City.objects.filter(name__icontains=self.q, pk__in=qs_a)

希望对你有帮助

【讨论】:

  • 这是一个最优方案,因为qs_a是一个惰性执行的查询集,在这种情况下甚至从不单独执行,因为两个查询集都编译为一个SQL命令:SELECT id, ... FROM app_city WHERE name LIKE '...' AND id IN (SELECT city_id FROM app_articlepage WHERE city_id IS NOT NULL)跨度>
  • 谢谢你,原来是我错过的 pk__in arg!
猜你喜欢
  • 2019-09-28
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2011-03-06
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多