Хотя на SO уже есть ряд сообщений, в которых описываются похожие проблемы, большинство из них описывают обходные пути или содержат разрозненную информацию.
Чтобы упростить поиск этой информации, я опубликую простое изложение того, как достичь некоторых основных целей, используя функции django-taggit
, которые официально поддерживаются, но отсутствуют в официальная документация.
Как бы вы могли получить доступ и отобразить информацию о главных тегах X, используемых в приложении Django?
Чтобы получить доступ и отобразить информацию о главных тегах, используемых в приложении Django, вы можете использовать встроенную функцию most_common
следующим образом:
top_tags = User.tag.most_common()
Это возвращает набор запросов, содержащий все теги, размещенные в экземпляре User, в порядке убывания наиболее часто используемых. Допустим, у нас есть 3 тега: ["vegetables", "fruits", "candy"]
и 10 пользователей имеют тег fruits
, 4 пользователя имеют тег vegetables
и только 1 пользователь имеет тег 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 уже отфильтрованной подгруппы объекта User?
С 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 объект User был помечен 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
, чтобы ограничить поиск тега определенной подгруппой.
person
MSB
schedule
27.06.2018