我在电报机器人中创建了一个带有分页的通用键盘。它适用于 peewee 查询对象
ModelSelect
,但我无法将其保存到 redis 或其他存储中,现在我将其保存在内存中,每次运行该对象都会被删除,键盘也会停止工作。
我尝试过:
from playhouse.shortcuts import model_to_dict, dict_to_model
from peewee import *
db = SqliteDatabase('test.db')
class User(Model):
id: int
name: str = TextField()
class Meta:
database = db
# create User table
User.create_table()
# add new User
User(name = "new_user").save()
# select User with id = 1
item = User.select().where(User.id == 1)
print(f"SQL: {item.sql()}")
# try to convert ModelSelect to dict
_dict = model_to_dict(item)
print(_dict)
# try to convert dict to ModelSelect
_item = dict_to_model(User, _dict)
print(_item)
但出现错误:
SQL: ('SELECT "t1"."id", "t1"."name" FROM "user" AS "t1" WHERE ("t1"."id" = ?)', [1])
Traceback (most recent call last):
File "C:\testfile.py", line 27, in <module>
_dict = model_to_dict(item)
File "C:\Python310\lib\site-packages\playhouse\shortcuts.py", line 74, in model_to_dict
for field in model._meta.sorted_fields:
AttributeError: 'ModelSelect' object has no attribute '_meta'
这是错误的想法。将模型instances序列化为字典是完全可以的,并且它们可以反序列化回模型实例。但是,您不能合理地期望序列化查询对象。该查询仅代表 SQL,并且在执行时包含对游标对象的引用。
如果你想序列化一个对象,你会:
# select User with id = 1 -- note call to .get()!!
item = User.select().where(User.id == 1).get()
data = model_to_dict(item)