результат запроса сортировки django по количеству вхождений - PullRequest
4 голосов
/ 06 января 2010

У меня есть текущие две модели:

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")

Для Item X я хочу получить список объектов Item, присутствующих в ItemList для всех объектов Profile, которые содержат X в ItemList, отсортированных по тому, сколько раз каждый объект появляется.

Лучшее, что я могу сделать на данный момент:

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

и это возвращает список всех нужных мне объектов Item с дубликатами (если Item Z присутствует в ItemList для 10 объектов Profile, он появится в результате запроса 10 раз).

Как можно отсортировать результат вышеупомянутого запроса по количеству раз, когда каждый объект появляется в результате, и удалить дубликаты? Есть ли какой-нибудь "джанго" способ сделать это?

Ответы [ 2 ]

7 голосов
/ 06 января 2010
profiles = Profile.objects.filter(profile__ItemList=X)

Item.objects.filter(
    user_itemlist__in=profiles
).annotate(itemcount=Count('id')).order_by('-itemcount')
3 голосов
/ 06 января 2010

если вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...