You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:54:01