django - 已解决 - 在 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)))
我用这段代码解决了这个问题。
解决方案
推荐阅读
- docker - 在本地找不到使用 docker-image-tool 构建的 spark 映像
- sql-server - 真实数据类型的 SUM 返回不正确的数据
- java - 在 Spring Data JPA 中设置 OneToMany 关系时父级如何拥有密钥
- python - 计算目录中的文件(python)
- sql - 分布式应用程序 - 单个用户更新数据库?
- typescript - VSCode 扩展 API 搜索和替换所有文件中的文本。(Ctrl+Shift+R的功能)
- css - 为什么我的外部 Tomcat 服务器有时不加载我的 CSS 文件?
- ios - Xamarin iOS 特征收集警告错误
- node.js - 如果 include 在 sequelize 中没有找到任何关系数据,则设置属性的 null 值
- android - Android - 如何从设置活动中更改 EditText 背景颜色?