使用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 # 取你需要的数值
检查模型字段定义和关联关系
- 确认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列表
- 如果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
相关产品推荐
相关产品推荐

