Как отфильтровать самые популярные теги django-taggit

Предположим, у вас есть база данных с объектами User, работающими за приложением Djano, и вы хотите использовать django-taggit для тегирования объектов User, чтобы вы могли извлекать подгруппы с помощью некоторой удобной фильтрации.

Кроме того, у вас есть панель инструментов, на которой вы хотите отображать интересную статистику об используемых тегах, чтобы собрать некоторую информацию о подгруппах, существующих в ваших пользователях.

  1. Как бы вы могли получить доступ и отобразить информацию о главных тегах X, используемых в приложении Django?

  2. Как получить доступ только к верхним тегам X уже отфильтрованной подгруппы объекта User?


person MSB    schedule 27.06.2018    source источник


Ответы (1)


Хотя на 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