2

以下は、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 の場合は の"Goodbye"代わりに返すようにし"Hello"ます。どうやってやるの?

特に、この marshamallow Schema に引数を渡して、内部から使用できるようにする方法がわかりません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
4

1 に答える 1