Django模型保存报错:int()参数不能为list类型问题求助
解决Django保存模型时的
TypeError: int() argument must be string, a bytes-like object or a number, not a 'list'问题 我一眼就看出问题所在了——你尝试给PunchCard模型的time字段赋值一个列表,但这个字段在模型里应该被定义成了数值类型(比如IntegerField)。Django在保存模型时,会自动把字段值转换成对应的数据类型,你塞个列表进去,它自然会报错说没法把列表转成整数。
接下来咱们一步步梳理并解决问题:
1. 先修复字段类型的核心问题
你的需求是存储多条打卡时间记录,那PunchCard的time字段绝对不能是数值型。推荐改用JSONField(Django 3.1+支持,适配多数主流数据库),它可以直接存储列表、字典这类结构化数据。
修改你的models.py里的PunchCard模型:
from django.db import models from django.db.models import JSONField # Django 3.1+ 内置的JSON字段 class PunchCard(models.Model): employee = models.ForeignKey(StaffMember, on_delete=models.CASCADE) time = JSONField(default=list) # 默认值设为空列表,方便直接append # 其他字段...
2. 修正代码里的语法与逻辑错误
你的代码还有几个小问题,不解决的话即使字段改了也跑不通:
- 时间计算的代码少了闭合括号,语法直接报错
- 变量名写错:
standardTime后面写成了standard_time,会触发NameError - try块里的
len(userPunchCard.time.punch)完全错误——如果time是列表,直接用len(userPunchCard.time)就行,根本没有punch属性 - 无脑捕获所有异常的写法会隐藏其他问题,应该针对性捕获特定异常
修正后的完整代码示例:
from datetime import datetime # 注意Python里是datetime,不是dateTime # 修复时间转换逻辑(补零避免格式错误,比如9点5分不会变成"95") now = datetime.now() # 用f-string补零,把时分转成4位数字(比如9:05变成0905) mili_time = int(f"{now.hour:02d}{now.minute:02d}") time_convert = mili_time - 1200 # 补零到4位,避免负数或位数不足的问题 time_string = str(time_convert).zfill(4) # 拆分出时分格式 standard_t = f"{time_string[:2]}:{time_string[2:]}" # 拼接最终时间字符串(假设p是日期,比如"2024-05-20") standard_time = f"{standard_t} {p}" # 获取当前登录用户(直接用user对象,不要通过name查,避免重名问题) user = StaffMember.objects.get(id=request.session['client']['id']) # 处理打卡记录逻辑 try: user_punch_card = PunchCard.objects.get(employee=user) except PunchCard.DoesNotExist: # 用户还没有打卡记录,直接创建新的 user_punch_card = PunchCard.objects.create(employee=user, time=[standard_time]) else: # 已有打卡记录,判断数量 if len(user_punch_card.time) < 2: user_punch_card.time.append(standard_time) else: # 这里可以根据需求调整:比如替换旧记录,或者不再添加 user_punch_card.time = [standard_time] # 示例:替换为新记录 user_punch_card.save()
3. 额外小建议
- 尽量用Python的
datetime模块处理时间,别自己拼接字符串,容易出格式错误 - 不要通过
name查询用户,重名的情况很常见,直接用user对象关联最可靠 - 永远不要捕获所有异常(
except:),针对性捕获DoesNotExist这类特定异常,能帮你快速定位其他问题
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

