Адаптация моего ответа из связанной проблемы 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)