首页 > 解决方案 > 如何使用相同的值但使用现有字段之一的不同数据类型来注释 Django Queryset?

问题描述

我有Django model一个NumberVal字段是models.FloatField().

然后我需要queryset像这样注释对象。annotate(numberval_as_text=str(OuterRef("NumberVal")))- 相同的值,但作为字符串,除了这会引发QuerySet.annotate() received non-expression(s): OuterRef(NumberVal)错误,这显然是正确的,但它证明了这一点。

我需要这个,因为这个注释后面跟着一个广泛的第二个注释,我numberval_as_text在子查询过滤器中需要这个。

任何提示将不胜感激。

标签: djangodjango-modelsdjango-querysetdjango-annotate

解决方案


调用str一个对象显然会给你一个对象的字符串表示,因此你会得到错误。如果想输入大小写,他们可以使用Cast数据库功能 [Django docs]

from django.db.models import CharField
from django.db.models.functions import Cast


queryset.annotate(numberval_as_text=Cast(OuterRef("NumberVal"), output_field=CharField(max_length=256)))

注意:除非此注释在子查询中,否则您希望使用F("NumberVal")( from django.db.models import F) 代替 OuterRef("NumberVal")


推荐阅读