簡體   English   中英

DjangoREST - 如何讓我的視圖/序列化器在服務器上更高效?

[英]DjangoREST - How can I make my view/serializer more efficient on the server?

我正在使用序列化程序從我的模型中提取特定的 object,然后使用所述 object 字段作為 URL 中的參數 via requests

我沒有收到任何錯誤,一切正常,但是我認為它可以更好地優化並且在服務器上更高效。

serializer.py

class BucketListExtraDataSerializer(serializers.ModelSerializer):

    bucket_return = serializers.SerializerMethodField()
    bucket_sectors = serializers.SerializerMethodField()
    
    class Meta:
        model = Bucket
        fields = ('id','stock_list','bucket_return','bucket_sectors')

    def get_bucket_return(self, obj):
        print(obj.stock_list)
        if obj.stock_list:
            symbols_unicode = (','.join(map(str, obj.stock_list)))
            print(symbols_unicode)
            postgrest_urls = f"http://localhost:3000/rpc/bucketreturn?p_stocks=%7B{symbols_unicode}%7D"
            bucket_return = requests.get(postgrest_urls, headers={'Content-Type': 'application/json'}).json()
            return bucket_return
    def get_bucket_sectors(self, obj):
        if obj.stock_list:
            symbols_unicode = (','.join(map(str, obj.stock_list)))
            postgrest_urls = f"http://localhost:3000/rpc/bucketsectors?p_stocks=%7B{symbols_unicode}%7D"
            bucket_sectors = requests.get(postgrest_urls, headers={'Content-Type': 'application/json'}).json()
            return bucket_sectors

我認為擁有多個SerializerMethodField()'s並不是最佳選擇。 這讓我想知道是否應該將所有額外的請求def_bucket_return + def_buket_sectors轉換為視圖。

我懷疑如果用戶有多個對象,將來事情會變得非常緩慢。

view.py

class BucketListExtraData(generics.ListAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = BucketListExtraDataSerializer
    queryset = Bucket.objects.all()

免責聲明:我發送請求的我的localhost:3000 API 也不是瓶頸問題。 目前我特別詢問我如何設置我的序列化程序和視圖。

關於如何優化我的序列化程序並更好地查看以更快地檢索和顯示數據到前端的任何建議?

您可以在 model 上將它們設為屬性。

class Bucket(models.Model):
    ...

    @cached_property
    def symbols_unicode(self):
        if not self.stock_list:
            return None
        return (','.join(map(str, self.stock_list)))

    @cached_property
    def bucket_return(self):
        if not self.symbols_unicode:
            return None

        postgrest_urls = f"http://localhost:3000/rpc/bucketreturn?p_stocks=%7B{self.symbols_unicode}%7D"
        bucket_return = requests.get(postgrest_urls, headers={'Content-Type': 'application/json'}).json()
        return bucket_return


    @cached_property
    def bucket_sectors(self):
        if not self.symbols_unicode:
            return None

        postgrest_urls = f"http://localhost:3000/rpc/bucketsectors?p_stocks=%7B{self.symbols_unicode}%7D"
        bucket_sectors = requests.get(postgrest_urls, headers={'Content-Type': 'application/json'}).json()
        return bucket_sectors

然后你的序列化器可以是這樣的:

class BucketListExtraDataSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Bucket
        fields = ('id', 'stock_list', 'bucket_return', 'bucket_sectors')

一般來說,我不喜歡在SerializerMethodField中做太多實際工作,特別是如果相同的邏輯將在其他地方使用。

這只是展示了如何在序列化程序中使用屬性。 它並沒有試圖解決您在單個 object 序列化期間發出兩個外部請求的事實,但我認為這不是您在問題中優化的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM