如何在Django中使用另一个QuerySet的结果来过滤QuerySet?

10

现在我有一个Django QuerySet,我想通过另一个QuerySet的结果进行过滤。目前我是这样做的(它可以工作):

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

其中字段是外键的名称,queryset 中的 pk。ORM 足够智能,可以将上述内容作为一个查询运行。

我试图将其简化为以下形式(即使用对象列表本身进行过滤,而不必明确指定 pk):

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

但是这会产生以下错误:

AssertionError: Cannot combine queries on two different base models.

如何以正确的方式进行此类型的过滤?

2个回答

12

您可以执行以下操作:

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

结果将是模型中字段为其他查询中模型的外键的对象


-2

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

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

我明白,但在这种情况下应该放什么?你能放 .filer(in=...) 吗?(我的想法是否定的)。 - Alex Rothberg
是的,您可以使用Person.objects.filter(name="michael").filter(lastname="riemann")。 - michaelwayman
这些都是使用字符串过滤器的示例。它并没有回答如何使用查询集。 - Alex Rothberg
每个数据库中的表都应该有一个主键。如果两个表彼此相关,则应使用外键、一对一或多对多关系来表示。当您查询一个表时,请在所示方法中引用关系的主键到另一个表。您不使用查询集来进行查询,而是使用元组和关系来选择您需要的数据,即使跨多个表也可以。 - michaelwayman
我理解“主键”和“外键”的概念,我提出了一个能够实现这一点的解决方案。我的问题是除了我提出的方案,是否有更好的查询写法。 - Alex Rothberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接