【发布时间】:2010-07-20 20:00:43
【问题描述】:
简而言之,过滤器内的所有查询的表名都重命名为 u0、u1、...,所以我的额外 where 子句不知道要指向哪个表。我希望不必为我可能对这些数据进行子选择的每一种方式手动进行所有查询,而我目前的解决方法是将我的额外查询转换为 pk values_lists,但这些查询真的很慢而且令人厌恶。
这就是这一切的样子。除了指向 products_product.id 的第一条 sql 行之外,您几乎可以忽略此管理器方法的额外内容的详细信息:
def by_status(self, *statii):
return self.extra(where=["""products_product.id IN
(SELECT recent.product_id
FROM (
SELECT product_id, MAX(start_date) AS latest
FROM products_productstatus
GROUP BY product_id
) AS recent
JOIN products_productstatus AS ps ON ps.product_id = recent.product_id
WHERE ps.start_date = recent.latest
AND ps.status IN (%s))""" % (', '.join([str(stat) for stat in statii]),)])
这对于仅涉及 products_product 表的所有情况都非常有效。
当我想要这些产品作为子选择时,我会这样做:
Piece.objects.filter(
product__in=Product.objects.filter(
pk__in=list(
Product.objects.by_status(FEATURED).values_list('id', flat=True))))
我怎样才能保持查询集的泛化能力,但仍然使用额外的 where 子句?
【问题讨论】:
-
如果不是很明显,我希望看到该解决方案的“Product.objects.filter(pk__in=list(”部分消失。
-
能否请您发布您想在应用程序中使用的实际代码以及 django 将生成的查询(即使它的 SQL 表命名错误)。您可以使用
print Piece.objects.filter(...).query执行此操作。谢谢! -
Piece.objects.filter(product__in=Product.objects.by_status(FEATURED))
-
我想我想要的是让我的额外位置以某种方式被告知其表名正在更改,并让它适当地适应。
标签: django django-orm subquery