django之 Object of type xxx is not JSON serializable

编程入门 行业动态 更新时间:2024-10-26 03:29:33

在启动django框架运行之后,我进行测试用户的登录功能模块,

我输入正确的用户名和密码以及验证码之后,本来正常情况时之间跳转到主页面的,

虽然报的信息是“登录成功!”,但是发现跳转到主页面不成功,

然后就发现Pycharm终端报了这样一个错误:

Internal Server Error: /web/employer_dologin/
Traceback (most recent call last):
  File "D:\env\first\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "D:\env\first\lib\site-packages\django\utils\deprecation.py", line 96, in __call__
    response = self.process_response(request, response)
  File "D:\env\first\lib\site-packages\django\contrib\sessions\middleware.py", line 58, in process_response
    request.session.save()
  File "D:\env\first\lib\site-packages\django\contrib\sessions\backends\db.py", line 83, in save
    obj = self.create_model_instance(data)
  File "D:\env\first\lib\site-packages\django\contrib\sessions\backends\db.py", line 70, in create_model_instance
    session_data=self.encode(data),
  File "D:\env\first\lib\site-packages\django\contrib\sessions\backends\base.py", line 105, in encode
    serialized = self.serializer().dumps(session_dict)
  File "D:\env\first\lib\site-packages\django\core\signing.py", line 87, in dumps
    return json.dumps(obj, separators=(',', ':')).encode('latin-1')
  File "D:\python3.9\lib\json\__init__.py", line 234, in dumps
    return cls(
  File "D:\python3.9\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "D:\python3.9\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "D:\python3.9\lib\json\encoder.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=companypany_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':selfpany_id,'company_name':selfpany_name,'company_type':selfpany_type,
            'company_scale':selfpany_scale,'company_area':selfpany_area,'company_site':selfpany_site,
            'company_href':selfpany_href,'company_email':selfpany_email,'establish_date':self.establish_date,
            'detail_information':self.detail_information,'company_relevant':selfpany_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':selfpany_id,'company_name':selfpany_name,'company_type':selfpany_type,
            'company_scale':selfpany_scale,'company_area':selfpany_area,'company_site':selfpany_site,
            'company_href':selfpany_href,'company_email':selfpany_email,'establish_date':str(self.establish_date),
            'detail_information':self.detail_information,'company_relevant':selfpany_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

本文发布于:2023-06-14 08:45:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1457654.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:type   Object   django   serializable   JSON

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!