Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

327
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!