我正在尝试在应用程序中使用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,但认为它已被弃用。不用担心,如果您现在有使用该代码的代码并希望继续使用它,那么它不会很快消失。