防止在SerializerMethodField中重复查询

    技术2022-07-10  117

      在 Django 中使用序列化器时遇到一个问题,两个变量使用同一个函数两次来返回参数,为了优化这个问题。

    我采用了 Django 中的方法 cached_property 来缓存值,避免重复计算但这样也带来另一个问题,当序列化多个对象时, GoodsSerializer(goods_list, many=True).data

    由于序列化第一个值的时候,被 cached_property 修饰的值已经存在序列化器对象中,之后的模型对象在序列化时使用的仍然时之前的值。所以我们遍历被 cached_property 修改的变量,删除它,

    下面是最后的序列化器

    from django.utils.functional import cached_property from rest_framework import serializers class GoodsSerializer(serializers.ModelSerializer): slogan = serializers.SerializerMethodField() label = serializers.SerializerMethodField() class Meta: model = Goods fields = ('goods_id', 'goods_name', 'slogan', 'label') def to_representation(self, instance): self._obj = instance # 删除上次序列化缓存的值 for attr in ('cached_goods_config',): if hasattr(self, attr): delattr(self, attr) return super(GoodsSerializer, self).data @cached_property def cached_goods_config(self): return utils.get_data_from_goods_config(goods_id=self._obj.goods_id) def get_slogan(self, obj): return self.cached_goods_config.get('slogan') def get_label(self, obj): return self.cached_goods_config.get('label')

    其他方式:

    当然,我们也可以使用嵌套层级,将可能需要重复计算的变量放到一个参数中,使用字典的格式返回,具体情况可自行变更;有些时候我们也可以中模型类中定义需要的变量,并使用 cached_property 修饰,但序列化器可能更灵活。
    Processed: 0.011, SQL: 9