You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用ExpressionWrapper报错:IntegerField无get_internal_type属性

问题原因

你遇到的报错是因为导入的IntegerField类不对——你同时从django.db.models和django.forms导入了IntegerField,后者覆盖了前者。而ExpressionWrapper的output_field参数需要的是Django模型字段类(django.db.models下的),不是表单字段类(django.forms下的),表单字段类没有get_internal_type方法,所以触发了错误。

解决方案

1. 修正导入语句

删除从django.forms导入的IntegerField、DecimalField、DateField;如果需要用到表单字段,改用别名区分,避免和模型字段冲突:

# 原导入行
from django.forms import DateField, DecimalField, IntegerField

# 修改为(需要表单字段时)
from django.forms import DateField as FormDateField, DecimalField as FormDecimalField, IntegerField as FormIntegerField
# 若不需要表单字段,直接删除该行即可

2. 明确指定模型字段类

如果不想修改导入语句,也可以在使用ExpressionWrapper时直接用models.IntegerField():

age = ExpressionWrapper(
    ExtractYear(dt.today()) - ExtractYear(F('dob')),
    output_field=models.IntegerField()
)

修正后的完整代码片段

Profile.objects.filter(
    id__in=Wallet.objects.filter(
        id__in=purchases_made_for_on_store_products.values('wallet')
    ).values('user')
).values('dob').annotate(
    age=ExpressionWrapper(
        ExtractYear(dt.today()) - ExtractYear(F('dob')),
        output_field=models.IntegerField()
    )
)

内容的提问来源于stack exchange,提问作者Leroy Mapunzwana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:05