python - Marshmallow:如何覆盖此 Python 类的构造函数?

标签 python serialization overriding marshmallow

下面是我的python marshmallow我在基于 SQLAlchemy 的应用程序中使用的序列化程序。

import simplejson
from marshmallow import Schema
class MySerializer(Schema):
    class Meta:
        json_module = simplejson
        fields = ('field1', 'field2', 'field3')

    field3 = fields.Method('get_field3')

    def get_field3(self, this_obj):
        return "Hello"

我是这样称呼这个序列化程序的:

my_argument = 1
items=MySerializer(documents=list_of_my_objects, many=True).data

现在,我想更改序列化程序,使其接受一个额外的参数(我将传入 my_argument),如果该参数的值为 1,则返回 "Goodbye" 代替 "Hello"。我该怎么做?

特别是,我不知道如何将参数传递给此 marshamallow 架构,以便它可以从 get_field3 内部获得。我知道我需要覆盖 __init__() 方法。但我不确定它应该是什么样子。我尝试了以下方法,但没有用:

def __init__(self, documents, many, my_arg):
    self.my_arg = my_arg
    super(Schema, self).__init__(documents, many=many)

def get_field3(self, this_obj):
    self.my_arg == 1:
        return "Goodbye"
    else:
        return "Hello" 

这是我得到的堆栈跟踪:

my_project/my_models/serializers.pyc in __init__(self, documents, many, my_arg)
---> 25         super(Schema, self).__init__(documents, many=many)

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in __init__(self, obj, extra, only, exclude, prefix, strict, many, skip_missing, context)
--> 273             self._update_fields(self.obj, many=many)

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in _update_fields(self, obj, many)
--> 636         ret = self.__filter_fields(field_names, obj, many=many)

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in __filter_fields(self, field_names, obj, many)
--> 683                         attribute_type = type(obj_dict[key])
TypeError: list indices must be integers, not str

最佳答案

只需从 kwargs 中弹出添加的 arg 以避免任何错误(您可以将任何 kwargs 传递给以这种方式重新定义的方法):

class MySerializer(Schema):
    # ...
    def __init__(self, *args, **kwargs):
        self.my_arg = kwargs.pop('my_arg') if 'my_arg' in kwargs else None
        super(Schema, self).__init__(*args, **kwargs)

现在您可以传递自定义 kwarg(关键字 参数,而不是位置参数)来创建对象:

MySerializer(documents=list_of_my_objects, many=True, my_arg=1)

关于python - Marshmallow:如何覆盖此 Python 类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550904/

相关文章:

command-line - 执行版本 :perform 时无法在命令行上覆盖 POM 属性

python - 使用 google analytics api 及其客户端 google-api-python-client 创建一个 Web 应用程序?

django - DRF 嵌套序列化器支持空字段

c++ - c++中的重写函数

css - Joomla - 覆盖 bootstrap.min.css

ReSTLet 2.1-M4 以上版本的 Java 序列化问题

python - 套接字 'No route to host' 错误

python - Python3.0动态导入模块?

python - 如何用Pygame画一个棋盘并移动棋盘上的棋子?

c# - 以特定格式 .net 将 DateTime 序列化为 XML