Python 使用带有many=True的DRF序列化程序时共享繁重的计算结果

Python 使用带有many=True的DRF序列化程序时共享繁重的计算结果,python,django-rest-framework,Python,Django Rest Framework,有一个简单的DRF序列化程序: class MySeriliazer(serializers.Serializer): some_field = serializers.SerializerMethodField(read_only=True) def get_some_field(self, obj): some_list = utils.do_some_heavy_calculations() return some_list[obj.s

有一个简单的DRF序列化程序:

class MySeriliazer(serializers.Serializer):
    some_field = serializers.SerializerMethodField(read_only=True)

    def get_some_field(self, obj):
         some_list = utils.do_some_heavy_calculations()
         return some_list[obj.some_field]
如您所见,我有一个
some_字段
字段,该字段的值是通过某个函数计算的

当我得到一个对象时,这是一个很大的问题,但是当我将这个序列化程序与
many=True
一起使用时,因此接收多个对象
do\u一些重计算
get called for each,这是非常昂贵的

此外,有时很少有字段使用相同的重函数。比如:

class MySeriliazer(serializers.Serializer):
    some_field1 = serializers.SerializerMethodField(read_only=True)
    some_field2 = serializers.SerializerMethodField(read_only=True)

    def get_some_field1(self, obj):
         some_list = utils.do_some_heavy_calculations()
         return some_list[obj.some_field1]

    def get_some_field2(self, obj):
         some_list = utils.do_some_heavy_calculations()
         return some_list[obj.some_field2]
对每个对象调用函数两次。不好的。有什么办法可以解决这个问题?果不其然,我可以从每秒更新的缓存中获取这些结果。但我认为可以以某种方式提取这些计算并在序列化过程中共享它们


如果需要-我使用DRF通用视图。

您应该执行对
utils的调用。在调用序列化程序并将其传递到上下文()之前,在视图中执行一些繁重的计算()

然后您可以通过
self.context

编辑:请注意,您可以覆盖视图的
get\u serializer\u context
,以便轻松包含额外的计算