我有一个Django model
,它有一个为models.FloatField()
的NumberVal
字段。
然后我需要像这样注释queryset
对象.annotate(numberval_as_text=str(OuterRef("NumberVal")))
-相同的值,但作为一个字符串,只是这会引发QuerySet.annotate() received non-expression(s): OuterRef(NumberVal)
错误,这显然是正确的,但它证明了这一点。
我需要这个,因为这个注释后面是一个扩展的第二个注释,在子查询过滤器中我需要这个numberval_as_text
。
任何提示都将不胜感激。
在对象上调用str
显然会给您一个对象的字符串表示,因此您会得到错误。如果想键入case之类的内容,可以使用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")
您不需要使用OuterRef
。您可以只使用带有注释的纯转换。
from django.db import models
from django.db.models.functions import Cast
qs.annotate(numberval_as_text=Cast('NumberVal', output_field=models.CharField()))