Я создаю API, используя peewee как ORM, и мне нужна возможность конвертировать объект модели peewee в объект JSON для отправки пользователю. Кто-нибудь знает хороший способ сделать это?
Модель Peewee для JSON
Ответ 1
вы можете сделать что-то вроде этого:
class MyModel(peewee.Model):
def __str__(self):
r = {}
for k in self._data.keys():
try:
r[k] = str(getattr(self, k))
except:
r[k] = json.dumps(getattr(self, k))
return str(r)
class User(MyModel):
email = CharField()
status = CharField(default="enabled")
firstname = CharField()
lastname = CharField()
class Meta:
database = db
Ответ 2
Peewee имеет model_to_dict
и dict_to_model
помощники в модуле расширения playhouse.shortcuts
.
- http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#model_to_dict
- http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#dict_to_model
Вы можете использовать их следующим образом:
from playhouse.shortcuts import model_to_dict, dict_to_model
user_obj = User.select().where(User.username == 'charlie').get()
json_data = json.dumps(model_to_dict(user_obj))
Также обратите внимание, что model_to_dict()
может переписываться через связанные модели, включать модели с обратной ссылкой и исключать из поля определенные поля.
Ответ 3
также вы можете получить модель как dict, а затем преобразовать в json с правильными типами полей (bool, int, float и т.д.):
import peewee
import json
from bson import json_util
from datetime import datetime
class User(peewee.Model):
email = CharField()
status = BooleanField(default=True)
firstname = CharField()
lastname = CharField()
age = IntegerField()
created = DateTimeField(default=datetime.now())
class Meta:
database = db
user = User.select().dicts().get()
print json.dumps(user, default=json_util.default)