[英]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.