【问题标题】:DjangoREST - How can I make my view/serializer more efficient on the server?Django REST - 如何让我的视图/序列化器在服务器上更高效?
【发布时间】:2023-04-08 05:09:01
【问题描述】:

我正在使用序列化程序从我的模型中提取特定对象,然后通过requests 将所述对象字段用作 URL 中的参数。

我没有收到任何错误,一切正常,但我认为它可以在服务器上进行更好的优化并提高效率。

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 也不是瓶颈问题。目前我特别询问我如何设置我的序列化程序和视图。

关于如何优化我的序列化程序并更好地查看以更快地检索和显示数据到前端有什么建议吗?

【问题讨论】:

    标签: python django django-rest-framework django-views


    【解决方案1】:

    您可以在模型上设置它们的属性。

    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 中做太多实际工作,尤其是在其他地方使用相同的逻辑时。

    这只是展示了如何在序列化程序中使用属性。它并没有试图解决您在单个对象的序列化期间发出两个外部请求的事实,但我认为这不是您在问题中优化的意思。

    【讨论】:

    • 这是一个很好的建议!没想到,从那里我可以将两个请求合二为一,然后将 json 数据捆绑成一个。
    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2016-02-17
    • 2023-02-13
    • 1970-01-01
    • 2015-09-28
    • 2020-11-11
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多