Как определить функцию для получения элемента поля схемы Marshmallow при сериализации через вложенную схему - PullRequest
0 голосов
/ 09 июля 2020

Итак, у меня есть много вложенных схем (например, Users) внутри другой схемы (например, Computer). Мой входной объект, десериализованный схемой, сложен и не позволяет назначать, а изменять его для разрешения назначения нецелесообразно.

Входной объект (например, ComputerObject) сам по себе не содержит значение, называемое «Пользователи», но вложенная в несколько других объектов, является функцией, которая может получить пользователей (например, ComputerObject.OS.Accounts.getUsers()), и я хочу, чтобы выходные данные этой функции использовались как значение для этого поля в схеме.

Существуют два возможных решения, о которых я знаю, я мог бы либо определить поле как field.Method(#call the function here), либо я мог бы сделать функцию @post_dump, чтобы вызвать функцию и добавить ее в окончательный вывод JSON, как это возможно предоставить как исходный объект, так и вывод JSON.

Проблема с обоими из них заключается в том, что он затем не сериализует его через вложенную схему Users, которая содержит больше вложенных схем и так далее, он просто установил бы это поле равным возвращаемому значению getUsers, чего я не хочу.

Я попытался определить его в pre-dump, чтобы затем он мог быть s erialized в дампе (примечание: эта схема используется только для сброса, а не для загрузки), но поскольку он принимает исходный объект, я не могу ему присвоить.

В принципе, у меня есть вещь, которую я пытаюсь do, и куча хакерских обходных решений, которые могли бы заставить его работать, но не без нарушения других вещей или полного отказа от проверки, но никакого реального решения, похоже, никто не знает, как это сделать правильно?

Для дальнейшего info, объект, который вводится, представляет собой сложную Django Модель, которая может дать мне некоторые возможности, о которых я не знаю, мой Django опыт в некоторой степени недостаточен.

1 Ответ

0 голосов
/ 10 июля 2020

Итак, я в конце концов понял это:

Вместо управления получением данных в основной схеме вы можете определить метод, используемый в подсхеме, с помощью post_dump с many = True, таким образом, следующий код будет работать правильно:

class User(Schema):
    id = fields.UUID

    @pre_dump(pass_many=True)
    def get_data(self, data, **kwargs):
        data = data.Accounts.getUsers()
        return data

class Computer(Schema):
    #The field will need to be called "OS" in order to correctly look in the "OS" attribute for further data
    OS = fields.Nested(User, many=True, data_key="users")
...