SQLAthanor:仅序列化为json特定字段

时间:2018-12-09 09:59:57

标签: python-3.x sqlalchemy

是否有一种方法可以使用SQLAthanor序列化仅包括特定字段的SQLAlchemy模型?该文档没有提及它,所以我发现的唯一方法是手动过滤结果。

因此,此行带有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 :(得分:0)

根据相关Github issue调整我的答案:

您可以更改序列化字段列表而无需调整实例配置的唯一方法是手动调整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)