更新了我的项目中的依赖项
前
marshmallow-sqlalchemy==0.17.0
marshmallow==3.0.0b6
Run Code Online (Sandbox Code Playgroud)
后
marshmallow-sqlalchemy==0.21.0
marshmallow==3.5.0
Run Code Online (Sandbox Code Playgroud)
我有这样一个模型(简化):
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyModel(Base):
__tablename__ = 'my_model'
id = Column(BigInteger, primary_key=True)
field_name = Column(String)
password = Column(String)
Run Code Online (Sandbox Code Playgroud)
和架构:
from marshmallow import fields
from marshmallow_sqlalchemy import (
ModelSchema,
field_for,
)
class RegistrarSchema(ModelSchema):
class Meta:
model = MyModel
other_field_name = fields.Function(lambda obj: obj.field_name)
field_name = field_for(MyModel, 'field_name', load_from='other_field_name')
password = fields.Method("get_password")
def get_password(self, obj):
return decrypt_password(obj)
def load(self, data, session=None, instance=None, transient=False, *args, **kwargs):
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SQLAlchemy 和 Marshmallow 将新用户插入到数据库中。该user参数是从 API 端点接收的。一切正常,直到我到达create函数中的这一行:
db.session.add(new_user)
Run Code Online (Sandbox Code Playgroud)
此时new_user变量的值是:
{'password': 'string', 'email': 'fave@string', 'username': 'string'}
Run Code Online (Sandbox Code Playgroud)
功能:
def create(user):
uname = user.get('username')
email = user.get('email')
password = user.get ('password')
existing_username = User.query.filter(User.username == uname).one_or_none()
if existing_username is None:
schema = UserSchema()
new_user = schema.load(user, session=db.session)
db.session.add(new_user) <- It fails here
db.session.commit()
return schema.dump(new_user), 201
Run Code Online (Sandbox Code Playgroud)
楷模:
class User (db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
profile_picture = db.Column(db.String(20), …Run Code Online (Sandbox Code Playgroud) python sqlalchemy flask-sqlalchemy flask-marshmallow marshmallow-sqlalchemy
我试图让 Marshmallow-SQLAlchemy 反序列化具有嵌套对象的对象,而不指定嵌套对象的外键(应该是父对象的主键)。这是一个独立的示例:
# Python version == 3.8.2
from datetime import datetime
import re
# SQLAlchemy == 1.3.23
from sqlalchemy import func, create_engine, Column, ForeignKey, Text, DateTime
from sqlalchemy.ext.declarative import as_declarative, declared_attr
from sqlalchemy.orm import relationship, sessionmaker
# marshmallow==3.10.0
# marshmallow-sqlalchemy==0.24.2
from marshmallow import fields
from marshmallow.fields import Nested
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
################################################################################
# Set up
################################################################################
engine = create_engine("sqlite:///test.db")
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
################################################################################
# Models
################################################################################
@as_declarative()
class Base(object):
@declared_attr
def __tablename__(cls):
# From …Run Code Online (Sandbox Code Playgroud)