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
相关产品推荐
相关产品推荐

