2016-11-17 11 views
2

Django Rest Frameworkシリアライザで複数のフィールドを設定するには、同じメソッドを一度呼び出す方法はありますか?これは私が今やっていることですが、これは明らかにメソッドを2回呼び出します。一度しか呼び出されないようにするにはどうすればいいですか?Django Rest Frameworkシリアライザで複数のフィールドを設定するメソッドを一度呼び出す

class MyModel(models.Model): 
    def GetTwoValues(self): 
     foo = [] 
     bar = [] 

     # expensive operation 

     return foo, bar 

class MyModelSerializer(serializers.HyperlinkedModelSerializer): 
    foo = serializers.SerializerMethodField() 
    bar = serializers.SerializerMethodField() 

    def get_foo(self, obj): 
     foo, _ = obj.GetTwoValues() 
     return foo 

    def get_bar(self, obj): 
     _, bar = obj.GetTwoValues() 
     return bar 

    class Meta: 
     model = MyModel 
     fields = ('FirstValue', 'SecondValue',) 

答えて

2

いくつかのオプションがあります:高価な方法は、一度だけ呼び出されるように

1)の値を保管してください。例えば:

def _get_two_values(self, obj): 
    if not hasattr(self, '_two_values'): 
     self._two_values = obj.GetTwoValues() 
    return self._two_values 

def get_foo(self, obj): 
    foo, _ = self._get_two_values(obj) 
    return foo 

def get_bar(self, obj): 
    _, bar = self._get_two_values(obj) 
    return bar 

2)シリアライザからの両方のフィールドを削除し、シリアライザのto_representation方法で両方の値を割り当てます。例:

def to_representation(self, obj): 
    data = super().to_representation(obj) 
    foo, bar = obj.GetTwoValues() 
    data['foo'] = foo 
    data['bar'] = bar 
    return data 
関連する問題