Flask SQLAlchemyAutoSchema嵌套反序列化

Flask SQLAlchemyAutoSchema嵌套反序列化,flask,flask-sqlalchemy,marshmallow-sqlalchemy,Flask,Flask Sqlalchemy,Marshmallow Sqlalchemy,我有以下资料: Models.py class Policy(db.Model): policy_id = db.Column(db.Integer, primary_key=True) client_reference = db.Column(db.String(50), nullable=False) submission_id = db.Column(db.ForeignKey('submission.submission_id'), nullable=False)

我有以下资料:

Models.py

class Policy(db.Model):
    policy_id = db.Column(db.Integer, primary_key=True)
    client_reference = db.Column(db.String(50), nullable=False)
    submission_id = db.Column(db.ForeignKey('submission.submission_id'), nullable=False)

    submission = relationship("Submission", back_populates="policies", lazy='joined')


class Submission(db.Model):
    submission_id = db.Column(db.Integer, primary_key=True)
    client_reference = db.Column(db.String(50), nullable=False)

    policies = db.relationship('Policy', back_populates='submission', lazy='joined')
Schema.py

class PolicySchema(SQLAlchemyAutoSchema):
    class Meta:
        model = Policy
        include_relationships = True
        load_instance = True
        unknown = INCLUDE
        exclude = ("submission",)

    submission_id = auto_field("submission")


class SubmissionSchema(SQLAlchemyAutoSchema):
    class Meta:
        model = Submission
        include_relationships = False
        load_instance = True

    policies = fields.Nested(PolicySchema, many=True, allow_none=True)
routes.py

@submission_api.route('/submission/', methods=['POST'])
def add_new():
    body = request.get_json()
    validated_request = SubmissionSchema().load(body, session=db.session)
    db.session.add(validated_request)
    db.session.commit()
    return jsonify({"submission_id": validated_request.submission_id}), 200
如果我尝试使用以下方式将新记录添加到提交中:

{
    "client_reference": "POL1",
    "description": "hello"
}
它工作正常

如果我打电话给:

{
    "client_reference": "POL1","description": "hello",
    "policies": [{"client_reference": "A1"}]
}
我收到这个错误:

File "/usr/local/lib/python3.8/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 89, in load
    raise ValueError("Deserialization requires a session")
ValueError: Deserialization requires a session

我不明白为什么。我以相同的方式为这两个对象传递会话(其功能相同)。我做了一个更改以导致此问题,因为它正在工作(提醒您更频繁地提交代码)。

恐怕没有真正的解决方案,只是本文讨论的解决方法。引述:

我们创建自己的嵌套字段继承原始棉花糖嵌套字段,允许我们向下传递会话对象,这难道不合理吗?这会以任何方式降低可用性吗

据我所知,解决方案应该是这样的:

来自棉花糖导入字段
类嵌套(字段嵌套):
“”“从其父级继承会话的嵌套字段。”“”
def_反序列化(self、*args、**kwargs):
如果hasattr(self.schema,“session”):
self.schema.session=db.session#在此处覆盖会话
self.schema.transient=self.root.transient
return super()。_反序列化(*args,**kwargs)

因此,您可以在
schemy.py
的顶部创建自己的
Nested
字段(我刚刚从marshmallow sqlalchemy复制了代码),并覆盖会话。

为什么在SubmissionSchema中使用include\u relationships=False,尽管存在关系?可能没那么简单。我只是想排除那些看起来很明显的错误。我只是想把两者都设置为相同的(双向)-相同的错误。原因是,对于GET来说,我想让提交人独自返回,没有孩子,但返回父母的政策——你认为这是一种不好的实施方式吗?是有道理的。不幸的是,这个问题不容易解决。我已经发布了一个解决方案,我已经找到了一个答案。谢谢你,它非常有效。我很担心我为什么会碰到这个。我是否以一种意想不到的方式做了什么?如果不是,我会认为这是一个非常普遍的问题??我试图理解GitHub的问题,但恐怕这超出了我的理解范围。据我所知,这是一个真正的问题,只是由于维护人员缺乏时间而没有得到解决。我说不出它有多普遍;这似乎是一个边缘案件。