django 此查询集包含对外部查询的引用,只能在子查询中使用

a5g8bdjr  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(106)

模型ProductFilter具有productsManyToManyField。我需要从最高优先级的product.filtersProductFilter.priority字段)获取属性to_export
我发现了这个

filters = ProductFilter.objects.filter(
    products__in=[OuterRef('pk')]
).order_by('priority')

Product.objects.annotate(
    filter_to_export=Subquery(filters.values('to_export')[:1])
)

但它提高了
ValueError:此查询集包含对外部查询的引用,只能在子查询中使用。
你知道为什么吗?

oxiaedzo

oxiaedzo1#

这是老生常谈,但无论如何:
似乎相关查找无法处理此处的OuterRefproducts__in=[OuterRef('pk')]
注意:在Django 3.2中,OP的例子产生了不同的错误,即TypeError: Field 'id' expected a number but got ResolvedOuterRef(pk).
因为这里只有一个pk值,所以我认为您不需要使用__in查找。
下面的似乎工作,虽然我不确定这是否正是OP想要的:

filters = ProductFilter.objects.filter(
    products=OuterRef('pk')  # replaced products__in lookup
).order_by('priority')

products = Product.objects.annotate(
    filter_to_export=Subquery(filters.values('to_export')[:1])
)

生成的SQL(稍微简化的表名):

SELECT "product"."id", (
    SELECT U0."to_export" 
    FROM "productfilter" U0 
    INNER JOIN "productfilter_products" U1 
    ON (U0."id" = U1."productfilter_id") 
    WHERE U1."product_id" = "product"."id" 
    ORDER BY U0."priority" DESC LIMIT 1
) AS "filter_to_export" 
FROM "product"

相关问题