有一个简单的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_field
字段,其值通过某个函数计算。
当我得到一个单个对象时,这是一个很大的问题,但是当我使用这个序列化程序many=True
时,接收多个对象do_some_heave_calculations
会被调用,这非常昂贵。
此外,有时很少有字段使用相同的重功能。像:
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通用视图。
答案 0 :(得分:1)
在调用序列化程序并将其传递给上下文(http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context)之前,您应该在视图中执行对utils.do_some_heavy_calculations()
的调用。
然后您可以通过self.context
修改:请注意,您可以覆盖视图get_serializer_context
以轻松包含额外的计算。