Python 3.x SQLAthanor:仅序列化为json特定字段
有没有办法使用SQLAthanor序列化只包含特定字段的SQLAlchemy模型?文档中没有提到它,所以我找到的唯一方法是手动过滤结果 这是sqlathanor的一行Python 3.x SQLAthanor:仅序列化为json特定字段,python-3.x,sqlalchemy,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([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中是否有一个内置的方法来执行此操作?根据相关的: 在不调整实例配置的情况下更改序列化字段列表的唯一方法是手动将
的结果调整为\()
。您的代码片段是实现这一点的一种方法,尽管对于JSON和YAML,您还可以提供一个自定义的serialize_函数
,该函数接受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_函数
方法为您提供了更大的灵活性,可以对序列化输出进行更复杂的调整,并且(我认为)更容易阅读/维护代码(尽管如果您所做的只是调整包含的字段,那么您的代码片段已经非常可读)
您还可以泛化serialize_函数
。因此,如果您想给它一个要包含的字段列表,只需将它们作为关键字参数包含在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)