簡単に言うと、フィルター内にあるすべてのクエリのテーブル名が 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 句を使用するにはどうすればよいですか?