django manytomany order_by关系数量

时间:2017-12-20 04:40:14

标签: django manytomanyfield

我与ProductTag有很多关系,我希望找到与我的标签集最匹配的产品。

class Product(models.Model):
    def __str__(self):
        return self.title
    title = models.CharField(max_length=200)
    price = models.IntegerField()
    tags = models.ManyToManyField(Tag, related_name="products", blank=True)

class Tag(models.Model):
    def __str__(self):
        return self.name
    name = models.CharField(max_length=50)

我有一个tag的查询集,我想根据所选标签的大部分产品订购我的产品?

这样做有什么好的技巧吗?或者我是否只需要查询所有产品,然后自己对它们进行排序?

例如,如果我有一个带有3个标签的QuerySet: STEMProgrammingK-6

我有产品:

Computer Science Book (Programming),
Engineering Puzzle (K-6, STEM),
Cookie Cutters (K-6),
Rocket (STEM, K-6, Programming),
Backpack (K-6)

我想按顺序返回相同的项目:

Rocket (STEM, K-6, Programming),
Engineering Puzzle (K-6, STEM),
Computer Science Book (Programming),
Cookie Cutters (K-6),
Backpack (K-6)

2 个答案:

答案 0 :(得分:0)

没有办法做到这一点,只有一种方法可以做到这一点。 获取所有产品。

d = {}
products = Product.objects.all()
for a in products:
    tags = a.tags.values_list('name', flat=True)
    d[a.name] = tags

for k in sorted(d, key=lambda k: len(d[k]), reverse=True):
    print k , d[k]

答案 1 :(得分:0)

如果要根据“多个”关系(ManyToMany或ForeignKey)计数对查询集进行排序,请执行以下操作。

from django.db.models import Count

# assume 'selected_tags' contains tags to be filtered
ordered_products = Product.objects.filter(tags__in=selected_tags).annotate(num_tags=Count('tags')).order_by('-num_tags')