django manytomany order_by 关系数
django manytomany order_by number of relationships
我与Product
s和Tag
s有manytomany关系,我想找到与我的标签集最匹配的产品。
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
s 的查询集,我想根据所选标签最多的产品来订购我的产品?
有什么巧妙的技巧可以做到这一点吗?还是我必须查询所有产品然后自己对它们进行排序?
例如,如果我有一个带有 3 个标签的查询集:
STEM
、Programming
、K-6
我有产品:
Computer Science Book (Programming),
Engineering Puzzle (K-6, STEM),
Cookie Cutters (K-6),
Rocket (STEM, K-6, Programming),
Backpack (K-6)
我想 return 这些相同的项目,但顺序是:
Rocket (STEM, K-6, Programming),
Engineering Puzzle (K-6, STEM),
Computer Science Book (Programming),
Cookie Cutters (K-6),
Backpack (K-6)
没有办法做到这一点,只有一种方法可以做到这一点。
获取所有产品。
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]
如果要根据 'Many' 关系(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')
我与Product
s和Tag
s有manytomany关系,我想找到与我的标签集最匹配的产品。
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
s 的查询集,我想根据所选标签最多的产品来订购我的产品?
有什么巧妙的技巧可以做到这一点吗?还是我必须查询所有产品然后自己对它们进行排序?
例如,如果我有一个带有 3 个标签的查询集:
STEM
、Programming
、K-6
我有产品:
Computer Science Book (Programming),
Engineering Puzzle (K-6, STEM),
Cookie Cutters (K-6),
Rocket (STEM, K-6, Programming),
Backpack (K-6)
我想 return 这些相同的项目,但顺序是:
Rocket (STEM, K-6, Programming),
Engineering Puzzle (K-6, STEM),
Computer Science Book (Programming),
Cookie Cutters (K-6),
Backpack (K-6)
没有办法做到这一点,只有一种方法可以做到这一点。 获取所有产品。
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]
如果要根据 'Many' 关系(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')