web-dev-qa-db-fra.com

Modèle Peewee à JSON

Je crée une API en utilisant peewee comme ORM et j'ai besoin de la possibilité de convertir un objet de modèle peewee en un objet JSON à envoyer à l'utilisateur. Est-ce que quelqu'un connaît un bon moyen de faire cela?

22
shoopdelang

Peewee a les aides model_to_dict et dict_to_model dans le module d'extension playhouse.shortcuts.

Vous pouvez les utiliser comme suit:

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))

Notez également que model_to_dict() peut utiliser des modèles associés, inclure des modèles avec référence arrière et exclure la sérialisation de certains champs.

67
coleifer

vous pouvez aussi obtenir un modèle sous forme de dict, puis convertir en json avec les types de champs appropriés (bool, int, float, etc.):

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)
3
kiba

J'implémente généralement le modèle dict dict et les modélisations de fonctions pour une sécurité maximale et une compréhension du fonctionnement interne du code. Peewee fait beaucoup de magie et vous voulez la contrôler.

L'argument le plus évident pour expliquer pourquoi vous ne devriez pas itérer sur les champs mais plutôt les spécifier explicitement est dû à des considérations de sécurité. Tous les champs ne peuvent pas être exposés à l'utilisateur, et je suppose que vous avez besoin de cette fonctionnalité pour implémenter une sorte d'API REST.

Donc, vous devriez faire quelque chose comme ça:

class UserData(db.Model):
    user = db.ForeignKeyField(User)
    data = db.CharField()

    def serialize():
        # front end does not need user ID here
        return {
            'data': self.data
        }

    @classmethod
    def from_json(cls, json_data):
        UserData.create(
            # we enforce user to be the current user
            user=current_user,
            data=json_data['data']
        )
0
Ron Reiter