我可以手动排序我的SQLAlchemyAutoSchema吗?



我刚刚开始使用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。

相关内容

  • 没有找到相关文章

最新更新