使用多个= True的DRF序列化程序时,会产生大量计算结果

时间:2015-11-26 01:16:07

标签: 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.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通用视图。

1 个答案:

答案 0 :(得分:1)

在调用序列化程序并将其传递给上下文(http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context)之前,您应该在视图中执行对utils.do_some_heavy_calculations()的调用。

然后您可以通过self.context

访问它

修改:请注意,您可以覆盖视图get_serializer_context以轻松包含额外的计算。