Django DRF中如何高效获取分类下多级多对多关联的去重FilterValue对象
解决方案
核心思路是直接利用Django ORM的跨关联查询能力,所有过滤、去重逻辑都在数据库层面完成,仅发起1次数据库请求,避免加载全量ProductVariant数据到内存,性能远高于嵌套循环实现。
代码实现
在你的Category模型中添加如下方法即可:
from django.db import models # 你原有的Category模型 class Category(models.Model): # 你原有的字段定义 # name = models.CharField(max_length=100) # ... 其他字段 def get_distinct_filter_values(self): # 直接从FilterValue反向跨两层多对多关联查询 return FilterValue.objects.filter( productvariant__product__category=self ).distinct()
逻辑说明
- ORM会自动将上述查询转换为带JOIN的SQL语句,关联
FilterValue与ProductVariant的多对多中间表、ProductVariant表、Product表后过滤匹配当前分类的记录 distinct()会自动对返回的FilterValue结果去重,不需要在Python内存层面处理重复数据- 如果已经提前拿到了当前分类的Product查询集,也可以用下面的写法,效果完全一致:
products = Product.objects.filter(category=self) filter_values = FilterValue.objects.filter( productvariant__product__in=products ).distinct()
性能优化建议
- 如果你只需要用到
FilterValue的部分字段(比如id和code),可以追加.only('id', 'code')缩小查询返回的字段范围,进一步减少IO开销 - 关联字段默认已经由Django创建了数据库索引,不需要额外处理即可保证JOIN效率
内容的提问来源于stack exchange,提问作者Michal Půlpán
相关产品推荐
相关产品推荐

