【问题标题】:Django fast Many-To-Many filteringDjango快速多对多过滤
【发布时间】:2020-12-01 13:44:41
【问题描述】:

假设我有两个模型:类别和产品

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 秒。有什么方法可以更快地获得不同的产品?我会很感激的

【问题讨论】:

    标签: django-models django-rest-framework django-orm


    【解决方案1】:

    您可以尝试从另一侧接近它。从类别中获取产品的 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)
    

    【讨论】:

    • 谢谢!现在过滤最多需要 5 秒,太棒了
    猜你喜欢
    • 2020-05-27
    • 2011-01-14
    • 1970-01-01
    • 2016-06-19
    • 2018-06-07
    • 2012-09-26
    • 2015-07-18
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多