Хотя в SO уже есть несколько постов, в которых описываются подобные проблемы, большинство из них описывают обходные пути или содержат разрозненную информацию.
Чтобы упростить поиск этой информации, я опубликую простое краткое изложение того, как достичь некоторых базовых вещей, используя функции django-taggit
, которые официально поддерживаются, но не присутствует в официальной документации.
Как бы вы открывали и отображали информацию о главных тегах X
используется в приложении Django?
Для доступа и отображения информации о главных тегах, используемых в приложении Django, вы можете использовать встроенную функцию most_common
, например, так:
top_tags = User.tag.most_common()
Возвращает набор запросов, содержащий все теги, размещенные в экземпляре пользователя, в порядке убывания наиболее часто используемых.
Допустим, у нас есть 3 тега: ["vegetables", "fruits", "candy"]
, и у 10 пользователей есть тег fruits
, у 4 пользователей есть тег vegetables
, и только у одного пользователя есть тег candy
, возвращаемый порядок будет: ["fruits", "vegetables", "candy"]
Доступ к дополнительной информации о возвращаемых тегах можно сделать так:
for tag in top_tags:
print(tag.name) #the name of the tag
print(tag.num_times) # the number of User objects tagged
Кроме того, если вас интересуют только первые 3 тега, вы можете
получить к ним доступ так:
top_tags = User.tag.most_common()[:3]
Где вы можете заменить 3 на X, где X - количество предметов, которые вы хотите вернуть.
Как бы вы получили доступ только к верхним тегам X уже отфильтрованного
подгруппа объекта Пользователь?
С 12 июля 2016 года функция most_common()
на самом деле имеет некоторые дополнительные аргументы, которые вы можете указать. Прежде всего вы можете указать min_count
, который отфильтровывает верхние теги, которые опускаются ниже определенного порога. В качестве иллюстрации используем теги из предыдущего примера:
top_tags = User.tag.most_common()[:3]
возвращает все три тега, как указано ранее, но с использованием
top_tags = User.tag.most_common(min_count=2)[:3]
возвращает только ["fruits", "vegetables"]
это потому, что только 1 пользовательский объект был помечен candy
, что означает, что он падает ниже min_count
из 2
Дополнительный аргумент, который вы можете предоставить most_common
, это extra_filters
, это позволяет вам предоставить объект, содержащий дополнительные значения фильтра, по которым вы хотите фильтровать теги.
Один из примеров использования:
filtered_users = User.objects.filter(age=20, is_delete=False)
top_tags = User.tag.most_common(
min_count=1, extra_filters={
'user__in': filtered_users
}
)
Здесь мы создаем отфильтрованный набор запросов объектов User, который затем передаем аргументу extra_filters
, чтобы ограничить поиск тегов определенной подгруппой