如何用相同的值来注释Django Queryset,但使用现有字段的不同数据类型



我有一个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()))

最新更新