.extra do django (onde = cláusulas são prejudicadas pela renomeação de tabela .filter (foo__in =… subselects
Resumindo, os nomes das tabelas de todas as consultas que estão dentro de um filtro são renomeados para u0, u1, ..., portanto, minhas cláusulas extras where não saberão para qual tabela apontar. Eu adoraria não ter que fazer todas as consultas manualmente de todas as maneiras possíveis para selecionar esses dados, e minha solução atual é transformar minhas consultas extras em pk values_lists, mas essas são realmente lentas e abominação.
Aqui está como isso tudo se parece. Você pode ignorar os detalhes do que é extra neste método de gerenciador, exceto a primeira linha sql que aponta para 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]),)])
O que funciona maravilhosamente para todas as situações que envolvem apenas a tabela products_product.
Quando eu quero esses produtos como uma subseleção, eu faço:
Piece.objects.filter(
product__in=Product.objects.filter(
pk__in=list(
Product.objects.by_status(FEATURED).values_list('id', flat=True))))
Como posso manter as habilidades generalizadas de um conjunto de consultas e ainda usar uma cláusula where adicional?