2015-11-16 57 views
1

我的API有ModelSerializer,它有三個使用serializers.SerializerMethodField類的自定義字段。他們看起來像這樣:Django REST框架:返回多個字段的一種方法

field1 = serializers.SerializerMethodField() 
field2 = serializers.SerializerMethodField() 
field3 = serializers.SerializerMethodField() 

def get_field1(self, obj): 
    f1, _, _ = get_field_values(obj.attribute, obj.another_attribute) 
    return f1 

def get_field2(self, obj): 
    _, f2, _ = get_field_values(obj.attribute, obj.another_attribute) 
    return f2 

def get_field3(self, obj): 
    _, _, f3 = get_field_values(obj.attribute, obj.another_attribute) 
    return f3 

正如你可以看到我打電話3次相同的功能,並得到相同的結果。我嘗試覆蓋__init__,但我似乎無法訪問這種情況下的每個對象(只是instance,這是完整的查詢集)。有沒有我可以覆蓋的函數,我可以將這些輸出值存儲爲一個字典,並在我的字段方法中逐一返回值?

回答

1

可以通過幾種方法避免三次調用get_field_values,以下是我嘗試過的一種方法。

def get_all_f(self, obj, return_key): 
    f1,f2,f3 = get_field_values(obj.attribute, obj.another_attribute) 
    self.f = {'f1' : f1, 'f2' : f2, 'f3' : f3 } 
    return self.f.get(return_key) 

def get_field1(self, obj): 
    f1 = self.f.get('f1', None) 
    if f1 is None : 
     f1 = get_all_f('f1')   
    return f1 

def get_field2(self, obj): 
    f2 = self.f.get('f2', None) 
    if f2 is None : 
     f2 = get_all_f('f2')   
    return f2 

def get_field3(self, obj): 
    f3 = self.f.get('f3', None) 
    if f3 is None : 
     f3 = get_all_f('f3')   
    return f3 

這個想法很簡單,將變量存儲在對象中作爲緩存。在查詢數據庫之前檢查這個緩存變量。

+0

好主意,沒想到在獲取第一個值時實例化它。謝謝! – benwad

相關問題