django rest framework(drf)序列化程序加速
drf-serializer-cache的Python项目详细描述
django rest framework序列化程序加速
DRF序列化程序的简单短生命缓存实现。 它解决了drf序列化程序的两个问题:
Serializer.fields
属性在某些情况下可能非常慢。 这种情况包括复杂的ModelSerializer
,序列化器层次结构 使用重复序列化程序和递归序列化程序。fields
在每个序列化运行的类中缓存并计算一次。 这导致限制-fields
不应动态调整 序列化程序内部,继承自SerializerCacheMixin
;- 默认情况下,如果 它们两次遇到具有相同序列化程序的同一对象。这个可以转动 如果多个对象包含同一个很难序列化的依赖项 物体。缓存避免在遇到实例表示时重新计算实例表示 多次出现相同的实例。
性能结果
缓存生存期和失效
cache设计简单,不易出错。
当顶级序列化程序to_representation
启动时创建缓存
一旦这个方法完成就被清除。因此没有必要
对于超时或复杂的缓存失效。之间没有共享数据
请求。
因此,以下情况可以正常工作:
user=User.objects.get(name='Lee')data_1=UserSerializer(user).data# OrderedDict([('name', 'Lee')])user.name='Bob'user.save()data_2=UserSerializer(user).data# OrderedDict([('name', 'Bob')])
用法
用法应该很简单-在
继承自Serializer
或ModelSerializer
:
fromdrf_serializer_cacheimportSerializerCacheMixinfromrest_frameworkimportserializersclassUserSerializer(SerializerCacheMixin,serializers.ModelSerializer):classMeta:model=Userfields=('id','name')
常见陷阱
缓存清理太频繁
缓存位于序列化程序层次结构根目录中,但定义了它的生存期
通过最近的树节点,它继承自SerializerCacheMixin
。
理想的情况是根继承自SerializerCacheMixin
。
这就是为什么SerializerCacheMixin
使用自定义list_serializer_class
,
它也继承自SerializerCacheMixin
。
如果使用自定义列表作为序列化程序层次结构的根-建议
使用SerializerCacheMixin
作为基类。
层次结构太多
默认情况下,序列化程序通过在它们的
子序列化程序。这个案子可以破serializers.SerializerMethodField
如果它使用某种序列化程序而不调用其上的bind
:
fromdrf_serializer_cacheimportSerializerCacheMixinfromrest_frameworkimportserializersclassResultSerializer(SerializerCacheMixin,serializers.Serializer):results=serializers.SerializerMethodField()defget_results(self,instance):# recursive serializerserializer=self.__class__(instance.results,many=True)serializer.bind('*',self)# bind call is essential for efficient cache !returnserializer.data