Django报错:TypeError: CharField对象无法JSON序列化,求解决
Django TypeError: Object of type CharField is not JSON serializable 问题排查与解决
问题描述
开发Django项目时触发错误:TypeError: Object of type CharField is not JSON serializable,项目核心代码如下:
models.py
from django.db import models class Identity(models.Model): first_name=models.CharField(max_length=40,null=True,blank=False), last_name=models.CharField(max_length=40,null=True,blank=False), def __str__ (self): return self.first_name
serializers.py
from rest_framework import serializers from .models import Identity class IdentitySerializer(serializers.ModelSerializer): class Meta: model = Identity fields=('first_name','last_name',)
views.py
from rest_framework import generics from .models import Identity from .serializers import IdentitySerializer class IdentityList(generics.ListCreateAPIView): queryset=Identity.objects.all() serializer_class=IdentitySerializer class Identity(generics.RetrieveUpdateDestroyAPIView): queryset=Identity.objects.all() serializer_class=IdentitySerializer
应用urls.py
from django.urls import path,include; from App import views urlpatterns = [ path('identity', views.IdentityList.as_view()), path('<int:ik>/', views.Identity.as_view()), ]
错误原因
核心问题在models.py的Identity类字段定义中:字段末尾的逗号让first_name和last_name变成了元组,而非Django预期的CharField实例。当DRF尝试序列化模型时,会试图将元组内的CharField对象转为JSON,从而触发序列化错误。
解决方法
修改models.py,去掉字段定义末尾的逗号:
from django.db import models class Identity(models.Model): first_name=models.CharField(max_length=40,null=True,blank=False) last_name=models.CharField(max_length=40,null=True,blank=False) def __str__ (self): return self.first_name or '' # 避免first_name为None时触发AttributeError
额外优化建议
- 修正URL参数名:应用urls.py中,RetrieveUpdateDestroyAPIView默认使用
pk作为主键参数,需将<int:ik>/改为<int:pk>/:urlpatterns = [ path('identity', views.IdentityList.as_view()), path('<int:pk>/', views.Identity.as_view()), ] - 完善__str__方法:由于
first_name允许为null,当字段值为None时直接返回会报错,建议返回默认空字符串或组合名字段。
内容的提问来源于stack exchange,提问作者KumarZ
相关产品推荐
相关产品推荐

