我刚刚开始使用python中的marshmallow-sqlalchemy
包为我的flask应用程序工作。所有工作都很好,api输出了数据库的内容,但似乎是按字母顺序对字段进行排序,而不是我使用SQLAlchemy创建它们的顺序。模型类。现在我想知道是否有一种方法来禁止或至少手动排序字段?
我是这样创建数据库表的:
class Product(db.Model):
p_id = db.Column(db.Integer, primary_key=True)
p_name = db.Column(db.String(100), nullable=False)
p_type = db.Column(db.String, nullable=False)
p_size = db.Column(db.Integer, nullable=False)
p_color = db.Column(db.String, nullable=False)
def __repr__(self):
return f"Product(name={self.p_name}, type={self.p_type}, size={self.p_size}, color={self.p_color})"
这是我的schema:
class ProductSchema(SQLAlchemyAutoSchema):
class Meta:
ordered = True #I have read about this property on another post, but doesn't do anything here
model = Product
函数返回json格式的内容:
def get(self, id):
if id:
product = Product.query.filter_by(p_id=id).first()
if product:
product_schema = ProductSchema()
output = product_schema.dump(product)
else:
abort(Response('product not found', 400))
else:
products = Product.query.all()
products_schema = ProductSchema(many=True)
output = products_schema.dump(products)
return jsonify(output), 200
a和我得到的输出(按字母顺序排序):
[
{
"p_color": "test color1",
"p_id": 1,
"p_name": "test name1",
"p_size": 8,
"p_type": "test type1"
},
{
"p_color": "test color2",
"p_id": 2,
"p_name": "test name2",
"p_size": 8,
"p_type": "test type2"
},
{
"p_color": "test color3",
"p_id": 3,
"p_name": "test name3",
"p_size": 8,
"p_type": "test type3"
},
{
"p_color": "test color4",
"p_id": 4,
"p_name": "test name4",
"p_size": 8,
"p_type": "test type4"
}
]
如上所述,我的应用程序功能齐全。但我至少想知道发生了什么。所以任何帮助都是感激的!
默认情况下,Flask在转储json输出时对键进行排序。这样做是为了使顺序是确定的,从而允许计算哈希等。
查看文档
您可以使用JSON_SORT_KEYS
参数禁用此功能。
如果您想调试marshallow部分,只需在视图函数中打印dump (output
)。
除非你有很好的理由强制输出顺序,否则你最好还是让它去吧。
注意:在flask-smorest中,我不介意有效载荷在响应中按字母顺序排序,但我喜欢在发布OpenAPI规范文件时排序,所以我不修改JSON_SORT_KEYS
,并且在服务于规范文件的资源中,我不使用jsonify
,而是原始json.dumps。