заказано = Правда не соблюдается. питон + зефир + колба

это снова я, теперь с вопросом о зефире, у меня следующая структура:

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"
            }
        ]
    }
}

похоже, что свойство order = True в классе ChildSchema не работает. Я искал это в некоторых сообщениях, и похоже, что проблема возникает, когда вы смешиваете вложенные поля и упорядоченное свойство.

Это мой стек

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

person Filmora Legends    schedule 25.03.2021    source источник


Ответы (1)


Я вижу, что вы можете попробовать две разные стратегии:

Добавьте эту строку конфигурации в свой код после определения приложения:

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

которые подавляют сортировку ключей словаря фляги и заставляют соблюдать определенный порядок.

Также вы можете попробовать добавить в класс ParentSchema ту же мету для ключей сортировки, поскольку ChildSchema содержится в ParentSchema; нам нужно указать ParentSchema, чтобы также соблюдался порядок ключей.

что-то вроде

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

    response = fields.Nested(ChildSchema)

Надеюсь, вы найдете это полезным, привет

person Juanse    schedule 25.03.2021