SQLAthanor: сериализация в json только определенных полей - PullRequest
0 голосов
/ 09 декабря 2018

Есть ли способ сериализации модели SQLAlchemy, включающей только определенные поля, используя SQLAthanor?Документация не упоминает об этом, поэтому единственный способ, который я выяснил, - отфильтровать результат вручную.

Итак, эта строка с sqlathanor

return jsonify([user.to_dict() for user in users for k, v in user.to_dict().items() 
                                if k in ['username', 'name', 'surname', 'email']])

эквивалентна этой, используяЗефир

return jsonify(SchemaUser(only=('username', 'name', 'surname', 'email')).dump(users, many=True))

Еще раз, есть ли в SQLAthanor встроенный метод для этого?

1 Ответ

0 голосов
/ 11 декабря 2018

Адаптация моего ответа из связанной проблемы Github :

Единственный способ изменить список сериализованных полей без настройки конфигурации экземпляра - вручную откорректировать результаты to_<FORMAT>().Ваш фрагмент кода является одним из способов сделать это, хотя для JSON и YAML вы также можете предоставить пользовательский serialize_function, который принимает dict, обрабатывает его и сериализует в JSON или YAML в зависимости от ситуации:

import simplejson as json

def my_custom_serializer(value, **kwargs):
    filtered_dict = {}
    filtered_dict['username'] = value['username']
    # repeat pattern for other fields

    return json.dumps(filtered_dict)

json_result = user.to_json(serialize_function = my_custom_serializer)`

Оба подхода фактически одинаковы, но подход serialize_function дает вам больше гибкости для более сложных настроек вашего сериализованного вывода и (я думаю) проще для чтения / поддержки кода (хотя, если все, что вы делаете - это корректируете включенные поля,ваш фрагмент уже вполне читабелен).

Вы также можете обобщить serialize_function.Поэтому, если вы хотите указать список полей для включения, просто включите их в качестве аргумента ключевого слова в to_json():

def my_custom_serializer(value, **kwargs):
    filter_fields = kwargs.pop(“filter_fields”, None)
    result = {}
    for field in filter_fields:
        result[field] = value.get(field, None)

    return json.dumps(result)

result = [x.to_json(serialize_funcion = my_custom_serializer,  filter_fields = ['username', 'name', 'surname', 'email']) for x in users)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...