我是靠谱客的博主 自由哈密瓜,最近开发中收集的这篇文章主要介绍django之 Object of type xxx is not JSON serializable,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
在启动django框架运行之后,我进行测试用户的登录功能模块,
我输入正确的用户名和密码以及验证码之后,本来正常情况时之间跳转到主页面的,
虽然报的信息是“登录成功!”,但是发现跳转到主页面不成功,
然后就发现Pycharm终端报了这样一个错误:
Internal Server Error: /web/employer_dologin/
Traceback (most recent call last):
File "D:envfirstlibsite-packagesdjangocorehandlersexception.py", line 34, in inner
response = get_response(request)
File "D:envfirstlibsite-packagesdjangoutilsdeprecation.py", line 96, in __call__
response = self.process_response(request, response)
File "D:envfirstlibsite-packagesdjangocontribsessionsmiddleware.py", line 58, in process_response
request.session.save()
File "D:envfirstlibsite-packagesdjangocontribsessionsbackendsdb.py", line 83, in save
obj = self.create_model_instance(data)
File "D:envfirstlibsite-packagesdjangocontribsessionsbackendsdb.py", line 70, in create_model_instance
session_data=self.encode(data),
File "D:envfirstlibsite-packagesdjangocontribsessionsbackendsbase.py", line 105, in encode
serialized = self.serializer().dumps(session_dict)
File "D:envfirstlibsite-packagesdjangocoresigning.py", line 87, in dumps
return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "D:python3.9libjson__init__.py", line 234, in dumps
return cls(
File "D:python3.9libjsonencoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "D:python3.9libjsonencoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "D:python3.9libjsonencoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type date is not JSON serializable
[26/Apr/2022 23:07:26] "POST /web/employer_dologin/ HTTP/1.1" 500 156307
类似的,我也遇到过DateFieled的错误,
最重要的是最后一句话:xxx类型的对象不可JSON序列化
Object of type ImageFieldFile is not JSON serializable
Object of type DateField is not JSON serializable
解决方法:
(1)是不是我的views.py 哪里写错了?
def web_employer_login(request):
"""web的用户登录"""
companylist = Company.objects.filter(status=1)
context = {'companylist':companylist}
return render(request, "web/employerlogin.html", context)
def web_employer_dologin(request):
"""web的执行用户登录:企业用户"""
try:
# 执行判断是否选择企业
if request.POST['company_id'] == 0:
return redirect(reverse("web:web_employer_login") + "?errinfo=1")
# 执行验证码的校验
if request.POST['code'] != request.session['verifycode']:
return redirect(reverse("web:web_employer_login") + "?errinfo=2")
# 根据登录账号获取登录者信息
company = Company.objects.get(employer_name=request.POST['employer_name'])
# 判断当前用户是否是正常或管理员
if company.status == 1 or company.status == 6:
if company.employer_password == request.POST['employer_password']: # 判断密码是否相同
print('登录成功')
# 将当前登录成功的用户信息以webuser为key写入到session中
request.session['webuser'] = company.toDict()
request.session['companyinfo'] = company.toDict()
context = {'company':company}
# 获取当前企业下所有的岗位信息
jlist = Job.objects.filter(company_id=company.company_id,status=1)
joblist = dict()
for vo in jlist:
j = {'job_id':vo.job_id,'job_name':vo.job_name}
joblist[vo.job_id] = j
# 将上面结果放入session中
request.session['joblist'] = joblist
# 重定向到前端管理首页
return render(request,"web/index.html",context)
else:
# context={"info":"登录密码错误!"}
return redirect(reverse("web:web_employer_login") + "?errinfo=5")
else:
# context={"info":"无效的登录账号!"}
return redirect(reverse("web:web_login")+"?errinfo=4")
# elif request.POST['user_status'] == 2:
except Exception as err:
print(err)
# context={"info":"登录账号不存在!"}
return redirect(reverse("web:web_employer_login") + "?errinfo=3")
没有发现问题。
(2)但是我猜想是在代码里写的这两句代码的原因导致了报错:
request.session['webuser'] = company.toDict()
request.session['companyinfo'] = company.toDict()
(3)紧接着找找是不是我的myadmin/models.py 哪里出错了?
class Company(models.Model):
company_id = models.AutoField(primary_key=True,verbose_name="企业ID")
company_name = models.CharField(max_length=100,verbose_name="企业名称",help_text="企业名称") # 企业名称
company_type = models.CharField(max_length=40,verbose_name="企业类型",null=True) # 企业类型
company_scale = models.CharField(max_length=40, verbose_name="企业规模", null=True) # 企业规模
company_area = models.CharField(max_length=40, verbose_name="地区" ,null=True) # 地区
company_site = models.CharField(max_length=60,verbose_name="详细地址", null=True) # 地址
company_email = models.CharField(max_length=40, verbose_name="企业邮箱", null=True) # 邮箱
company_href = models.CharField(max_length=100,verbose_name="企业网址", null=True) # 企业网址
establish_date = models.DateField(auto_now=True,verbose_name="成立日期",null=True)
detail_information = models.CharField(max_length=255, verbose_name="其他详细信息", null=True) # 其他详细信息
company_relevant = models.CharField(max_length=40, verbose_name="企业方向", null=True) # 企业方向
# 指定公司的企业用户账号 一对一:当employer被删除时,company被删除
# employer = models.OneToOneField(to=Employer, on_delete=models.CASCADE)
employer_name = models.CharField(max_length=40, verbose_name="企业用户", null=True) # 企业用户名
employer_password = models.CharField(max_length=40, verbose_name="企业用户密码", null=True) # 企业用户密码
status = models.IntegerField(default=1) # 状态:1正常/2禁用/6管理员/9删除
create_at = models.DateTimeField(default=datetime.now) # 创建时间
update_at = models.DateTimeField(default=datetime.now) # 更新时间
def toDict(self):
return {'company_id':self.company_id,'company_name':self.company_name,'company_type':self.company_type,
'company_scale':self.company_scale,'company_area':self.company_area,'company_site':self.company_site,
'company_href':self.company_href,'company_email':self.company_email,'establish_date':self.establish_date,
'detail_information':self.detail_information,'company_relevant':self.company_relevant,'status':self.status,
'employer_name':self.employer_name,'employer_password':self.employer_password,
'create_at':str(self.create_at.strftime('%Y-%m-%d %H:%M:%S')),
'update_at':str(self.update_at.strftime('%Y-%m-%d %H:%M:%S')),
}
class Meta:
db_table = "company"
其中我发现了DateFiled不就是Company类的“establish_date”这个属性吗?!那看了是这儿的问题:
报错的内容说是“ImageFieldFile类型的对象不可JSON序列化”,不能JSON序列化,意思应该是必须得是字符串吧
那我将这行代码添加一个:str(),强制转为字符串
class Company(models.Model):
company_id = models.AutoField(primary_key=True,verbose_name="企业ID")
company_name = models.CharField(max_length=100,verbose_name="企业名称",help_text="企业名称") # 企业名称
company_type = models.CharField(max_length=40,verbose_name="企业类型",null=True) # 企业类型
company_scale = models.CharField(max_length=40, verbose_name="企业规模", null=True) # 企业规模
company_area = models.CharField(max_length=40, verbose_name="地区" ,null=True) # 地区
company_site = models.CharField(max_length=60,verbose_name="详细地址", null=True) # 地址
company_email = models.CharField(max_length=40, verbose_name="企业邮箱", null=True) # 邮箱
company_href = models.CharField(max_length=100,verbose_name="企业网址", null=True) # 企业网址
establish_date = models.DateField(auto_now=True,verbose_name="成立日期",null=True)
detail_information = models.CharField(max_length=255, verbose_name="其他详细信息", null=True) # 其他详细信息
company_relevant = models.CharField(max_length=40, verbose_name="企业方向", null=True) # 企业方向
# 指定公司的企业用户账号 一对一:当employer被删除时,company被删除
# employer = models.OneToOneField(to=Employer, on_delete=models.CASCADE)
employer_name = models.CharField(max_length=40, verbose_name="企业用户", null=True) # 企业用户名
employer_password = models.CharField(max_length=40, verbose_name="企业用户密码", null=True) # 企业用户密码
status = models.IntegerField(default=1) # 状态:1正常/2禁用/6管理员/9删除
create_at = models.DateTimeField(default=datetime.now) # 创建时间
update_at = models.DateTimeField(default=datetime.now) # 更新时间
def toDict(self):
return {'company_id':self.company_id,'company_name':self.company_name,'company_type':self.company_type,
'company_scale':self.company_scale,'company_area':self.company_area,'company_site':self.company_site,
'company_href':self.company_href,'company_email':self.company_email,'establish_date':str(self.establish_date),
'detail_information':self.detail_information,'company_relevant':self.company_relevant,'status':self.status,
'employer_name':self.employer_name,'employer_password':self.employer_password,
'create_at':str(self.create_at.strftime('%Y-%m-%d %H:%M:%S')),
'update_at':str(self.update_at.strftime('%Y-%m-%d %H:%M:%S')),
}
class Meta:
db_table = "company"
再次重启django项目之后,发现这个报错问题消失了,好了,问题成功解决!!
最后
以上就是自由哈密瓜为你收集整理的django之 Object of type xxx is not JSON serializable的全部内容,希望文章能够帮你解决django之 Object of type xxx is not JSON serializable所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复