.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?

questionAnswers(1)

yourAnswerToTheQuestion