Django annotate Concat - 表达式包含混合类型。您必须设置 output_field

Posted

技术标签:

【中文标题】Django annotate Concat - 表达式包含混合类型。您必须设置 output_field【英文标题】:Django annotate Concat - Expression contains mixed types. You must set output_field 【发布时间】:2017-07-03 14:51:24 【问题描述】:

我有一个模型:

class Motocycle(models.Model):
    title = models.CharField(max_length=50, blank=True, default='')
    engine_displacement = models.IntegerField(default=0)

我想:

queryset = Motocycle.objects.annotate(
    full_name=Concat(
        'title',
         Value(' '),
         F('engine_displacement'),
         Value('')
    ),
).all()

但出现错误:Expression contains mixed types. You must set output_field:

queryset = Motocycle.objects.annotate(
    full_name=Concat(
        'title',
         Value(' '),
         F('engine_displacement'),
         Value(''),
    ),
    output_field=CharField(),
).all()

我尝试设置这个output_field,结果是:'CharField' object has no attribute 'resolve_expression'

我做错了什么?谢谢。

【问题讨论】:

【参考方案1】:

您必须将output_field 传递给您的数据库函数,在您的代码中将其传递给注释。

queryset = Motocycle.objects.annotate(
    full_name=Concat(
        'title',
         Value(' '),
         F('engine_displacement'),
         Value(''),
         output_field=CharField(),
    ),
).all()

【讨论】:

以上是关于Django annotate Concat - 表达式包含混合类型。您必须设置 output_field的主要内容,如果未能解决你的问题,请参考以下文章

Django annotate() 多次导致错误答案

django数据查询优化annotate和aggregate

Django annotate 返回了多个

使用 annotate() 包含一个 django 模型对象属性

Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?

Django 中的 GROUP_CONCAT 等效项