如何使用 Django 中另一个查询集的结果过滤查询集?

Posted

技术标签:

【中文标题】如何使用 Django 中另一个查询集的结果过滤查询集?【英文标题】:How to filter a query set with the results of another query set in Django? 【发布时间】:2014-12-13 10:31:40 【问题描述】:

现在我有一个 Django 查询集,我想通过另一个查询集的结果进行过滤。现在我正在这样做(并且有效):

field = 'content_object__pk'
values = other_queryset.values_list(field, flat=True)
objects = queryset.filter(pk__in=values)

其中字段是pk 中的外键名称queryset。 ORM 足够智能,可以运行上述查询。

我试图将其简化为(即使用对象列表本身进行过滤,而不必明确说出pk):

field = 'content_object'
objects = queryset & other_queryset.values_list(field, flat=True)

但这会产生以下错误:

AssertionError: Cannot combine queries on two different base models.

进行此类过滤的正确方法是什么?

【问题讨论】:

【参考方案1】:

你可以做下一个:

result = MyModel.objects.filter(field__in=other_query)

结果将是模型中的对象,其中字段是 other_query 中模型的外键

【讨论】:

【参考方案2】:

您可以在 Django 中链接查询...

qs = entry.objects.filter(...).filter(...)

【讨论】:

我明白,但在这种情况下,......你能把.filer(in=...)(我的想法是没有)。 是的,你可以把 Person.objects.filter(name="michael").filter(lastname="riemann") 这些都是字符串过滤器的例子。它没有回答如何使用查询集。 数据库中的每个表都应该有一个主键。如果两个表相互关联,则应该用外键、一对一或多对多关系表示。 . 当你查询一张表的时候,用我展示的方法,将关系的主键引用到另一张表...你不使用查询集进行查询,你使用元组和关系来选择你需要的数据即使它跨越多个表 我理解 pk an fk 的概念。我提出了一个解决方案。我的问题是除了我提出的查询之外,是否还有其他方式来编写查询。

以上是关于如何使用 Django 中另一个查询集的结果过滤查询集?的主要内容,如果未能解决你的问题,请参考以下文章

django 查询所有与相关集的过滤?

Django如何过滤多对多字段中的对象,而不是原始查询集

有没有办法检查字符串是不是是 django 查询集的有效过滤器?

如何使用 Django Rest 过滤器限制查询结果

Django查询集QuerySet及两大特性

具有过滤查询集的组权限的自定义表单