私のPython marshmallowシリアライザは、私がSQLAlchemyベースのアプリケーションで使用しています。ここでマシュマロ:どうすればこのPythonクラスのコンストラクタをオーバーライドできますか?
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の場合、"Hello"
の代わりに"Goodbye"
を返します。どうやってやるの?
特に、この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