)破壞它,過濾器內部所有查詢的表名被重命名爲u0,u1,...。 ..,所以我多餘的where子句將不知道要指向哪個表。我很想不必手動進行所有查詢,以便我可以在這些數據上進行選擇,而我目前的解決方法是將我的額外'd查詢pk values_lists,但這些真的很慢並且是可憎的東西django's .extra(where =子句被表重命名爲.filter(foo__in = ...子查詢
這是所有這些看起來像你可以大多忽略這個管理器方法的額外細節,除了第一個sql指向products_product.id的行:
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(」該解決方案的一部分消失了。 – outofculture 2010-07-20 20:04:03
)您可以發佈您想要在您的應用程序中使用的實際代碼,這個查詢將由django生成(即使它的SQL表命名錯誤)。你可以用'print Piece.objects.filter(...)。query'來完成這個查詢。謝謝! – 2010-07-20 20:18:47
Piece.objects.filter(product__in = Product.objects.by_status(FEATURED)) – outofculture 2010-07-20 21:25:26