You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:49:15