首页 > 解决方案 > 已解决 - 在 django 中是否有带参数而不是 cache_proerty 的缓存属性?

问题描述

我有一个这样的序列化程序

class PaperEveryoneSerializer(ReadOnlyModelSerializer):
    author = serializers.SerializerMethodField()
    address = serializers.SerializerMethodField()

    def get_author(self, instance):
        if instance.paper_contractors.filter(profile__user=self.context['request'].user).exists():
            return str(instance.author)
        else:
            return ''

    def get_address(self, instance):
        if instance.paper_contractors.filter(profile__user=self.context['request'].user).exists():
            return {"old_address": instance.address.old_address, "old_address_eng": instance.address.old_address_eng}
        address_with_bun = instance.address.old_address.split("-")[0]
        hidden_address = address_with_bun[0:address_with_bun.rindex(" ")]
        old_address_eng = instance.address.old_address_eng
        hidden_address_eng = old_address_eng[old_address_eng.index(" ")+1:len(old_address_eng)]
        return {"old_address": hidden_address, "old_address_eng": hidden_address_eng}

我正在使用此代码隐藏私人信息。但是此代码将评估两次instance.paper_contractors.filter(profile__user=self.context['request'].user).exists()

有没有办法防止对查询集进行两次评估?我正在尝试使用缓存的属性来做到这一点。但它不允许发送参数。

--------答案---------- 首先,感谢bdbd 启发我解决问题。

Paper.objects.all().annotate(is_contractor=Case(When(Exists(Contractor.objects.filter(paper=OuterRef('pk'), profile__user=self.request.user)), then=True), output_field=BooleanField(), default=Value(False)))

我用这段代码解决了这个问题。

标签: djangodjango-rest-framework

解决方案


推荐阅读