Python 使用带有many=True的DRF序列化程序时共享繁重的计算结果
有一个简单的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
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
,以便轻松包含额外的计算