我正在使用 flask_restplus
和 flask_sqlalchemy
开发一个 API,并且有一个特殊情况,即某些应用程序应该仅访问 API 中的某些列。
我有一个模型:
class MyModel(db.Model):
__tablename_ = 'my_table'
id = db.Column(db.Integer, primary_key=True)
first_column = db.Column(db.Unicode)
second_column = db.Column(db.Unicode)
我还指定了要从 API 返回的 flask_resplus
' 模型:
my_model = api.model('MyModel',
{'first_column': fields.String(),
'second_column': fields.String()})
其中 api
是 flask_restplus
' Api
实例,db
是 flask_sqlachmey
的实例。
有时我只想选择某些列,而另一列在作为 JSON 响应返回的 api.model
中为 null
。
在网上搜索后,我发现两种方法都不适合我的情况:
来自 sqlalchemy.orm
的 load_only()
,它以 列表
的形式返回列。因此,我无法返回这些结果,因为我的模型需要一个具有与 my_model
中所述相同键的字典。另一种方法 with_entities()
返回 MyModel
的实例,这是我所需要的,但它在我将该实例传递给 时加载所有列>my_model
,因为它只执行惰性选择,即它选择指定的列,但如果需要其他列,它会再次执行查询以获取其他列的值,从而在我的情况下加载,所有列,这不是我想要的。
如何执行仅返回部分列且结果是 db.Model
实例的 SQL SELECT
?
最佳答案
如果您使用flask-marshmallow 进行序列化,则可以使用包含的(only()
) 或排除的(load_only()
) 字段列表加载架构。
这是一个粗略的模型,上面有:
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
db = SQLAlchemy()
ma = Marshmallow()
class MyModel(db.Model):
__tablename_ = 'my_table'
id = db.Column(db.Integer, primary_key=True)
first_column = db.Column(db.Unicode)
second_column = db.Column(db.Unicode)
class MyModelSchema(ma.ModelSchema):
class Meta:
model = MyModel
varlist = ['id','first_column']
def somefunction():
results = MyModel.query.all()
mymodelschema = MyModelSchema(many=True, only=varlist)
output = mymodelschema.dump(results).data
return jsonify(output) # or whatever you're doing with it
以下是 Marshmallow Schema API 的文档,其中有一些选项,包括排除列表中的所有内容,例如:https://marshmallow.readthedocs.io/en/latest/api_reference.html#marshmallow.Schema
关于python - 如何使用 Flask-SQLAlchemy 仅选择数据库中的某些列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634707/