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]