Mil*_*ano 5 python sql django django-models django-queryset
型号ProductFilter有products ManyToManyField. 我需要to_export从product.filters最高优先级(ProductFilter.priority字段)获取属性
我明白了这一点
filters = ProductFilter.objects.filter(
products__in=[OuterRef('pk')]
).order_by('priority')
Product.objects.annotate(
filter_to_export=Subquery(filters.values('to_export')[:1])
)
Run Code Online (Sandbox Code Playgroud)
但它提高了
ValueError:此查询集包含对外部查询的引用,并且只能在子查询中使用。
你知道为什么吗?
这是旧的,但无论如何:
看起来相关的查找不能OuterRef在这里处理:products__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])
)
Run Code Online (Sandbox Code Playgroud)
生成的 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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1693 次 |
| 最近记录: |