Serializers - Serializadores

Converter objetos Python para JSON e vice-versa.

Uso Básico

from velox.serializers import serializer, deserialize

# Serializar objeto
data = {'id': 1, 'name': 'João', 'email': 'joao@email.com'}
json_str = serializer(data)

# Desserializar
obj = deserialize(json_str)

Serializar Model

from velox.database import Model

class User(Model):
    table = 'users'

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'email': self.email,
        }

# Usar no Model
user = User.get(1)
data = user.to_dict()
json_str = serializer(data)

Serializar Lista

users = User.all()
data = [u.to_dict() for u in users]
json_str = serializer(data)

Campos Específicos

def to_dict(self, fields=None, exclude=None):
    d = self.__dict__.copy()
    d.pop('_state', None)

    if fields:
        d = {k: v for k, v in d.items() if k in fields}

    if exclude:
        d = {k: v for k, v in d.items() if k not in exclude}

    return d

Serializadores Customizados

from velox.serializers import Serializer

class UserSerializer:
    @staticmethod
    def serialize(user):
        return {
            'id': user.id,
            'name': user.name,
            'email': user.email,
            'created_at': user.created_at.isoformat() if user.created_at else None,
        }

    @staticmethod
    def deserialize(data):
        return User(
            id=data.get('id'),
            name=data.get('name'),
            email=data.get('email'),
        )

# Usar
json_str = UserSerializer.serialize(user)
user = UserSerializer.deserialize(data)

Serialização com Relationships

class PostSerializer:
    @staticmethod
    def serialize(post):
        return {
            'id': post.id,
            'title': post.title,
            'author': {
                'id': post.author.id,
                'name': post.author.name,
            },
            'tags': [t.name for t in post.related('tags')],
        }

JSON Response

@app.get('/api/users')
def list_users(req, res):
    users = User.all()
    data = [u.to_dict() for u in users]
    res.json(data)

@app.get('/api/users/<int:id>')
def get_user(req, res, id):
    user = User.get(id)
    if not user:
        res.json({'error': 'Not found'}, status=404)
        return
    res.json(user.to_dict())

Validação com Serializer

class UserInputSerializer:
    @staticmethod
    def validate(data):
        errors = {}

        if 'name' not in data or len(data['name']) < 2:
            errors['name'] = 'Nome deve ter no mínimo 2 caracteres'

        if 'email' not in data or '@' not in data['email']:
            errors['email'] = 'Email inválido'

        if errors:
            raise ValueError(errors)

        return data

# Usar
validated = UserInputSerializer.validate(req.json)