Django ORM вернул топ-10 во многих отношениях

My models.py имеет множество отношений между User а также Tag

class Tag(models.Model):
    name = models.CharField(unique=True, max_length=32)

class User(AbstractBaseUser, PermissionsMixin):
    tags = models.ManyToManyField(Tag, blank=True)    

Как я могу получить топ-10 тегов, упорядоченных по количеству пользователей с тегом? Что-то вроде

Tag.objects.order_by('user_set__count')[10]

Эта команда не работает, и Джанго жалуется, что

django.core.exceptions.FieldError: Невозможно разрешить ключевое слово "myuser_set" в поле. Возможные варианты: id, myuser, name

Это озадачивает, потому что t1.user_set.count() работает где t1 это Tag пример.

Кроме того, есть ли лучший способ получить топ-10 без заказа всех данных?

1 ответ

Решение

Ниже запрос возвращает список тегов, упорядоченных по количеству пользователей:

tags = Tag.objects.all().annotate(num_user = Count('user')).order_by('-num_user')

если вы хотите 10 лучших, используйте этот запрос:

tags = Tag.objects.all().annotate(num_user = Count('user')).order_by('-num_user')[:10]
Другие вопросы по тегам