Django使用OuterRef关联UUID类型主键时出现UUID校验错误该如何解决?
问题解答
OuterRef本身完全支持UUID类型,你遇到的报错和OuterRef的UUID兼容性无关,是Subquery返回值的类型推断错误导致的。
报错原因
你的Subquery返回的是Count聚合后的整数值,但你没有显式声明返回字段的类型,Django会默认尝试将Subquery的返回值和你关联的product外键字段类型(UUID)做匹配,当聚合结果为0时,Django会将数值0作为UUID做校验,因此抛出'0' it is not a valid UUID的错误。
修复方案
方案1:显式指定Subquery的返回字段类型
给Subquery添加output_field参数,声明返回值为整型即可解决类型不匹配问题:
from django.db.models import IntegerField queryset = queryset.filter(~Q(provider = provider)).annotate( sellproductprices=Subquery( prefetch_qr.filter(product=OuterRef('pk')) .values('id_sell_price') .annotate(count=Count('pk')) .values('count'), output_field=IntegerField() ) ).filter( sellproductprices__gt=0 ).prefetch_related( prefetch )
方案2(性能优化推荐):使用Exists替代计数判断
你的逻辑只需要筛选出存在关联记录的结果,不需要实际统计关联记录的数量,使用Exists性能更高,同时也不会出现类型匹配问题:
from django.db.models import Exists, OuterRef queryset = queryset.filter(~Q(provider = provider)).filter( Exists(prefetch_qr.filter(product=OuterRef('pk'))) ).prefetch_related( prefetch )
内容的提问来源于stack exchange,提问作者Erick Echeverry García
相关产品推荐
相关产品推荐

