Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

337
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda