Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

338
Vistas
¿Enviar valores de enumeraciones y guardarlos en db con matraz + marshmallow + sqlalachemy?

Estoy usando matraz + malvavisco + sqlalchemy.

Estoy obligado a:

Para enviar una solicitud http con este contenido:

 { "first_name": "John" "last_name": "Doe" "gender": "male" }

Y guarde el valor como un número entero en la base de datos, ya sea 0 para hombre o 1 para mujer.

identificación primer nombre apellido género
42 Juan Gama 0

El camino hasta ahora:

requisitos.txt

 ... Flask==2.0.1 flask-marshmallow==0.14.0 Flask-SQLAlchemy==2.5.1 marshmallow==3.13.0 marshmallow-enum==1.5.1 marshmallow-sqlalchemy==0.26.1 SQLAlchemy==1.4.22 ...

esquema.py

 from .models import Users, Genders from .extensions import ma class SignUpSchema(ma.SQLAlchemySchema): class Meta: model = Users first_name = ma.auto_field(data_key='firstName', required=True) last_name = ma.auto_field(data_key='lastName', required=True) gender = EnumField(enum=Genders, required=True)

vistas.py

 from flask import request from flask.views import MethodView from .schemas import SignUpSchema from .models import Users, Genders from .extensions import db class SignUp(MethodView): methods = ['POST'] def post(self): json_data = request.get_json() schema = SignUpSchema() data = schema.load(json_data) user = Users(**data) db.session.add(user) db.session.commit() return {'id': user.id}

modelos.py

 import enum from sqlalchemy import Column,Integer, String, Enum from .extensions import db class Genders(enum.Enum): MALE = "male" FEMALE = "female" class Users(db.Model): id = Column(Integer, primary_key=True) first_name = Column(String(100)) last_name = Column(String(100)) gender = Column(Enum(Genders))

Estado actual:

 { "firstName": "john", "lastName": "doe", "gender": "MALE" } 
identificación primer nombre apellido género
42 Juan gama MASCULINO

Simplemente no puedo entender cómo cambiar el valor de enumeración en la solicitud y la inserción de db.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Logré resolver el problema implementando un campo de malvavisco personalizado y cambiando el campo en el modelo sqlalchemy a Integer en lugar de un campo Enum . Esto tiene la desventaja de que los géneros recuperados de la base de datos no se pueden serializar con este GenderField de malvavisco personalizado.

 from marshmallow.fields import Field class GenderField(Field): def _serialize(self, value, attr, obj, **kwargs): return value.value if value is not None else '' def _deserialize(self, value, attr, data, **kwargs): options = [e.value for e in Genders] genders = {val: i for i, val in enumerate(options)} try: return genders[value] except KeyError as err: raise ValidationError(f'Value must be one of: {options}')

Editar:

Combinar el campo malvavisco con sqlalchemy TypeDecorator es otra solución que me gusta más. De esta manera, dividimos las cadenas para que sean para esquemas de malvavisco como el segundo valor en la tupla de enumeración, el primer valor (el int) va a la base de datos y todo el tipo se maneja como una enumeración para la aplicación del matraz.

 class Gender(Enum): MALE = 0, 'male' FEMALE = 1, 'female' class TupleEnum(TypeDecorator): impl = Integer @property def python_type(self): return type(self.enum_type) def __init__(self, enum_type, *args, **kwargs): super().__init__(*args, **kwargs) self.enum_type = enum_type def process_bind_param(self, value: Enum, dialect): return value.value[0] def process_result_value(self, value: int, dialect): options = {e.value[0]: e for e in self.enum_type} return options[value] def process_literal_param(self, value: int, dialect): return self.process_bind_param(value, dialect)
over 4 years ago · Santiago Trujillo Denunciar

0

SQLAlchemy guarda las enumeraciones como cadenas, no como números enteros 1 , por lo que no puede usar un Enum si necesita usar un número entero en la base de datos. De forma predeterminada, las cadenas utilizadas son los nombres de los miembros, pero puede especificar una función para usar los valores en su lugar... convertidos en cadenas.


  1. Documentos de enumeración de SQLAlchemy
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda