django-models - Django快速多对多过滤
问题描述
假设我有两个模型:类别和产品
class Category(models.Model):
name = models.CharField(max_length='255')
parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, related_name='children', related_query_name='child')
class Product(models.Model):
name = models.CharField(max_length='255')
category = models.ManyToManyField(Category)
我的数据库中有大约 600 万种产品和 12k 个类别。每个产品都有多个类别。我想按 category_id 过滤产品:
categories = [1, 5, 6, 7, ....]
products = Product.objects.filter(category__pk__in=categories)
过滤 MtM 字段可以返回重复项,所以我需要 distinct()。但使用 distict fitering 最多可能需要 15 秒。有什么方法可以更快地获得不同的产品?我将不胜感激
解决方案
你可以试着从另一边接近它。从类别中获取产品的 id,然后按 id 过滤产品。在我的测试中,我得到了 60% 的改进。
class Product(models.Model):
name = models.CharField(max_length='255')
category = models.ManyToManyField(Category, related_name="products")
product_ids = Category.objects.filter(id__in=categories).values_list("products__id", flat=True).distinct()
products = Product.objects.filter(id__in=product_ids)
推荐阅读
- javascript - NodeJS发布请求“无法发布/上传”
- php - 抽象类中的类型提示
- android - Android:听自定义 ADB/终端命令
- c++ - 将 struct timespec 添加到类(并且似乎没有其他类型)会导致 EXEC_BAD_ACCESS
- swift - 每天重新安排本地通知
- python - 无法以有组织的方式获得输出
- mysql - extract only time from dateTime using query builder
- r - How to write a (first-order) derivative as a function in R?
- webpack - 如何在 vue.config.js 中将 PurifyCSS 添加到 Vue CLI 3 项目中
- clojurescript - CSS and ReaKit from Fulcro