ordered = True 不被尊重。 python + 棉花糖 + 烧瓶

ordered = True not respected. python + marshmallow + Flask

又是我,现在有一个棉花糖问题,我有以下结构:

route.py

@models.response(ParentSchema())
def get(args, model_id):

    return {"response": {"a": [{"data": "a"}], "b": [{"data": "a"}], "c": [{"data": "a"}], "d": [{"data": "a"}]}}

那么这是我的模式文件 schema.py

class SubChildSchema(Schema):
    data = fields.Str(description="Model's name")


class ChildSchema(Schema):

    class Meta:
        ordered = True

    a = fields.Nested(SubChildSchema, many=True)
    b = fields.Nested(SubChildSchema, many=True)
    c = fields.Nested(SubChildSchema, many=True)
    d = fields.Nested(SubChildSchema, many=True)


class ParentSchema(Schema):
    response = fields.Nested(ChildSchema)

它假设在响应中我应该得到像这样的排序响应:

{
    "response": {
        "a": [
            {
                "data": "a"
            }
        ],
        "b": [
            {
                "data": "a"
            }
        ],
        "c": [
            {
                "data": "a"
            }
        ],
        "d": [
            {
                "data": "a"
            }
        ]
    }
}

但我收到的不是那个

{
    "response": {
        "b": [
            {
                "data": "a"
            }
        ],
        "c": [
            {
                "data": "a"
            }
        ],
        "d": [
            {
                "data": "a"
            }
        ],
        "a": [
            {
                "data": "a"
            }
        ]
    }
}

看起来 属性 ordered=True 在 ChildSchema class 上不起作用 我一直在一些帖子中寻找它,看起来当您混合嵌套字段和有序 属性.

时会出现问题

这是我的堆栈

flask-marshmallow==0.14.0
marshmallow==2.21.0
marshmallow-sqlalchemy==0.23.1

我看到您可以尝试两种不同的策略:

在应用定义之后将此配置行添加到您的代码中:

app = Flask (__ name__)
app.config ['JSON_SORT_KEYS'] = False

抑制 flask 字典键排序并强制遵守定义的顺序。

您也可以尝试在 ParentSchema class 中添加相同的排序键元,因为 ChildSchema 包含在 ParentSchema 中;我们也需要指定 ParentSchema 来遵守键顺序。

类似

class ParentSchema(Schema):
    class Meta:
        ordered = True

    response = fields.Nested(ChildSchema)

祝你好运