2017-08-04 48 views
0

我有API端點基於DRF 3.6.3已經響應(< 1秒的響應時間)。但是,當我使用模型方法的源添加新的序列化程序字段後,其執行速度非常慢(超過30秒的響應時間)。如何使用Model的方法加速Django Rest Framework序列化程序的性能?

編輯:所以性能問題,因爲我在該方法上處理的字段是外鍵。

這是我的代碼片段:

class Product(models.Model): 
    a_name = models.CharField() 
    b_name = models.ForeignKey(to=OutletProduct) 

    def all_name(self): 
     return u'%s %s' % (self.a_name, self.b_name) 

串行:

class ProductSerializer(serializers.ModelSerializer): 
    productid = serializers.ReadOnlyField(source='id') 
    productallname = serializers.CharField(source='all_name') 

    class Meta: 
     model = Product 
     fields = ('productid', 'productallname') 
     read_only_fields = ('productallname',) 

我只需要做好我的API輸出的小的定製,而且我不認爲重寫to_representation()是正確的做法這個。

謝謝你的幫助。基於對FK評論

+1

只要確保您打電話的字段不是FK。到目前爲止,我還沒有遇到性能問題,只需添加指向可調用字段的字段即可。 – Linovia

+0

是的,你是對的。性能問題,因爲我在該方法上處理的其中一個字段是FK。我會更新我的問題。 ,現在我把這個字段放在'setup_eager_loading(queryset)'後面,我沒有任何性能問題了。謝謝。 –

回答

0

,我對我的串行覆蓋setup_eager_loading(queryset)

class ProductSerializer(serializers.ModelSerializer): 
    productid = serializers.ReadOnlyField(source='id') 
    productallname = serializers.CharField(source='all_name') 

    class Meta: 
     model = Product 
     fields = ('productid', 'productallname') 
     read_only_fields = ('productallname',) 

    @staticmethod 
    def setup_eager_loading(queryset): 
     # select_related for 'to-one' relationships 
     queryset = queryset.select_related('b_name') 
     return queryset 

片段在我的觀點:

prepared_serializer = ProductSerializer.setup_eager_loading(product_list) 
products = ProductSerializer(prepared_serializer, many=True) 

讓我知道,如果有一個更好的(更快的性能)的答案。 謝謝!

相關問題