Flask + Marshmallow + Sqlalchemy如何使用嵌套字段加载

时间:2019-12-16 21:13:15

标签: python flask sqlalchemy marshmallow marshmallow-sqlalchemy

我正在尝试在应用程序中使用Flask +棉花糖+ SqlAlchemy。

我不确定我是否朝着正确的方向前进。

我有一个model1.py

class Model1(db.Model):
    __tablename__ = 'model_1'

    id = Column(INTEGER(11), primary_key=True)
    name = Column(String(45), nullable=False)

还有一个model2.py

class Model2(db.Model):
    __tablename__ = 'model_2'

    id = Column(INTEGER(11), primary_key=True)
    id_model_1 = Column(ForeignKey('model_1.id'), nullable=False, index=True)

    model_1 = relationship('Model1')

然后我有model1-schema.py

class Model1Schema(ma.ModelSchema):
    class Meta:
        model = Model1
        sqla_session = db.session

还有model2-schema.py

class Model2Schema(ma.ModelSchema):
    model1 = ma.Nested(Model1Schema)

    class Meta:
        model = Model2
        sqla_session = db.session

我还有一个Flask路线的控制器。

class Model2List(Resource):
    resource_schema = Model2Schema()
    list_schema = Model2Schema(many=True)

    def get(self):
        all_resources = Model2.query.all()
        all_resources = self.list_schema.dump(all_resources)
        return all_resources

    def post(self):
        args = request.get_json()
        resource = resource_schema.load(args)
        resource = self.resource_schema.dump(all_resources)
        return resource

get方法可以正常工作,为我提供了所有资源,包括嵌套的model1

问题出在post上。如果我使用以下方法制作post

{
  "id": 1,
  "model1": {
    "id": 1,
    "name": "name"
  }
}

正常。但这似乎是错误的,因为name是资源model1的一部分。

然后我可以编辑控制器以接受id_model1的参数:

    def post(self):
        args = request.get_json()
        model1 = Model1.query.get(args['id_model'])
        del args['id_model1']
        args['model1'] = model1

        resource = resource_schema.load(args)
        resource = self.resource_schema.dump(all_resources)
        return resource

然后发送:

{
  "id": 1,
  "id_model1": 1
}

但这似乎违背了marshmallow + flask的目的(我正在做所有验证,而不是棉花糖)

如何集成Flask + Marshmallow + SqlAlchemy

我使用棉花糖解析Flask输入的原因是由于flask documentation page

  

警告   Flask-RESTPlus的整个请求解析器部分将被删除,并将由有关如何与其他可以更好地完成输入/输出工作的软件包(例如棉花糖)集成的文档所取代。这意味着它将一直保留到2.0,但认为它已被弃用。不用担心,如果您现在有使用该代码的代码并希望继续使用它,那么它不会很快消失。

0 个答案:

没有答案