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

使用Peewee的save方法更新单条记录时,字段被错误赋值为元组导致类型错误的问题求助

使用Peewee的save方法更新单条记录时,字段被错误赋值为元组导致类型错误的问题求助

兄弟,我之前踩过类似的坑,给你几个排查方向和解决思路,应该能帮你搞定这个问题:

先排查变量本身的类型

你说like和dislike是整数,但报错提示传入了元组,大概率是这两个变量在代码里被意外赋值成了元组!比如有没有在其他地方写过类似:

like = Post.get_or_create(some_condition)

Peewee的get_or_create()方法返回的是**(模型实例, 是否创建成功)**的元组,如果直接把这个结果赋值给like,那它自然就是元组了,赋值给float字段肯定报错。

你可以在循环前先打印变量类型确认:

like = 123
dislike = 456
print("like类型:", type(like), "值:", like)
print("dislike类型:", type(dislike), "值:", dislike)

如果输出不是<class 'int'>,那就要往前找代码,修正变量的赋值逻辑,比如把元组解构:

like_obj, created = Post.get_or_create(...)
like = like_obj.some_numeric_field  # 取你需要的数值

检查模型字段定义和关联关系

  1. 确认Post模型里的like和dislike字段是单纯的FloatField,没有用复合字段或者其他特殊类型:
from peewee import Model, FloatField, ForeignKeyField

class Post(Model):
    like = FloatField()  # 确保是单个数值字段
    dislike = FloatField()
    user = ForeignKeyField(User, backref="posts")  # 这里backref如果是"posts",那user.posts才是关联的post列表
  1. 如果User和Post是一对多关系,那user.post可能会有问题,应该用user.posts(对应backref的名字),如果要取单个post,最好用明确的查询:
post = Post.get(Post.user == user)  # 确保拿到的是单个Post实例,而不是查询集

临时修复:强制转换类型

如果确认变量是合法的数值,只是赋值时出现了奇怪的类型问题,可以手动转成float再赋值:

for user in users:
    post = user.post  # 或者用上面的Post.get()
    post.like = float(like)
    post.dislike = float(dislike)
    post.save()

更高效的批量更新(如果适用)

如果所有用户的Post都要更新成相同的like和dislike值,建议用Peewee的批量更新,比循环save高效很多:

Post.update(like=like, dislike=dislike).where(Post.user.in_(users)).execute()

备注:内容来源于stack exchange,提问作者lazy_coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:09:30