2016-05-07 5 views
1

シリアライザのフィールドの1つがinitメソッドで作成された値に依存するシリアライザが必要です。リストシリアライザでDjango Rest Frameworkを使用するときにinitで変数を初期化する

私は次のような何かをしようとしている:random_idは、すべてのリスト項目について同じであるリスト・シリアライザを使用する際に

class MySerializer(serializers.ModelSerializer): 
    the_field_value = serializers.SerializerMethodField() 
    another_field_value = serializers.SerializerMethodField() 

class Meta: 
    model = MyModel 
    fields = ('id', 'the_field_value', 'another_field_value') 

def get_the_field_value(self, obj): 
    return "{0} ({1}) {2}".format(obj.name, obj.other_name, self.random_id) 

def get_another_field_value(self, obj): 
    return "{0} ({1}) {2}".format(obj.other_other_name, obj.other_name, self.random_id) 

def __init__(self, *args, **kwargs): 
    super(MySerializer, self).__init__(*args, **kwargs) 
    self.random_id = randint(1, 5) 

問題があります。

各リスト項目に対して実行するinitメソッドを指定するにはどうすればよいですか?

もっと詳しい例で更新されました。

+0

なぜ__init__メソッドでランダマイザを実行する必要がありますか?あなたが 'get_the_field_value'に入れたら、あなたの問題は解決されるはずです....? –

+0

@MarkChackerian私は、複数の関数で生成されたランダム変数を利用したいと思います。 – oowowaee

答えて

2

__init__は、あなたがインスタンスを作成するだけで1回呼び出されますので、正しいですが、あなたがそれを行う場合:

class MySerializer(serializers.ModelSerializer): 
    the_field_value = serializers.SerializerMethodField() 

    class Meta: 
     model = MyModel 
     fields = ('id', 'the_field_value') 

    def get_the_field_value(self, obj): 
     return "{0} ({1}) {2}".format(obj.name, obj.other_name, randint(1, 5)) 

あなたはリスト上のランダムな値を取得します。それがあなたを助けることを願っています。

+0

私の使用例では、いくつかのSerializerMethodFields()にこのランダム変数を使用したいので、インスタンスごとに1回は設定したいが、リストシリアライザごとには1回は設定したくない。 – oowowaee

1

many init methodを使用して、オブジェクトごとのリストの初期化をカスタマイズすることができます。ドキュメンテーションからは、どういう仕組みになっているかがはっきりしていませんが、オブジェクトごとにオブジェクトのリストの初期化をカスタマイズできるようです。

class MySerializer(serializers.ModelSerializer): 
    # all your fields and get methods... 

    def random_init(self): 
     return randint(1,5) 

    @classmethod 
    def many_init(cls, *args, **kwargs): 
     # Instantiate the child serializer. 
     kwargs['child'] = cls() 
     # add the random value 
     kwargs['random_id'] = cls.random_init() 
     # Instantiate the parent list serializer. 
     return MySerializer(*args, **kwargs) 

    def __init__(self, *args, **kwargs): 
     super(MySerializer, self).__init__(*args, **kwargs) 
     self.random_id = kwargs.get('random_id', self.random_init()) 
関連する問題