django按发生次数排序查询结果

时间:2010-01-06 19:52:32

标签: django sorting

我有两个流动的模型:

class Item(models.Model):
    Name = models.CharField(max_length = 32)

class Profile(models.Model):
    user = models.ForeignKey(User, unique = True)

    ItemList = models.ManyToManyField(Item, related_name = "user_itemlist")

对于项目X我想得到ItemList中存在的Item对象列表,其中包含ItemList中包含X的所有Profile对象,并按每个对象出现的次数排序。

我能做的最好的事情是:

Item.objects.filter(user_itemlist__in = User.objects.filter(profile__ItemList = X))

这将返回我需要的所有Item对象的列表,带有重复项(如果ItemList中的Item Z出现在10个Profile对象中,它将在查询结果中出现10次。)

如何按照每个对象在结果中出现的次数对上述查询的结果进行排序并删除重复项?有没有“django”的方法呢?

2 个答案:

答案 0 :(得分:7)

profiles = Profile.objects.filter(profile__ItemList=X)

Item.objects.filter(
    user_itemlist__in=profiles
).annotate(itemcount=Count('id')).order_by('-itemcount')

答案 1 :(得分:3)

如果你使用django 1.0+,你可以这样做:

from django.db.models import Count
# note that 'profile' is an instance of Profile, not the model itself
sorted_items = profile.ItemList.annotate(itemcount=Count('name'))
sorted_items = sorted_items.order_by('-itemcount')

#number of occurences of top item
sorted_items[0].itemcount