Короче говоря, имена таблиц всех запросов, которые находятся внутри фильтра, переименовываются в u0, u1, ..., так что мои дополнительные предложения where не будут знать, на какую таблицу указывать.Я бы не хотел делать вручную все запросы для каждого способа, которым я мог бы отобрать эти данные, и мой текущий обходной путь состоит в том, чтобы превратить мои дополнительные запросы в pk values_lists, но это действительно медленно и что-то вроде мерзости.
Вот как все это выглядит.В большинстве случаев вы можете игнорировать детали того, что происходит в дополнительном методе менеджера, за исключением первой строки 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?