首页 文章

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

提问于
浏览
2

有没有办法使用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']])

相当于使用Marshmallow的这个

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

再一次,SQLAthanor中是否有内置方法来执行此操作?

1 回答

  • 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)
    

相关问题