Как отфильтровать топ-теги django-taggit - PullRequest
0 голосов
/ 27 июня 2018

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

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

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

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

1 Ответ

0 голосов
/ 27 июня 2018

Хотя в 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, чтобы ограничить поиск тегов определенной подгруппой


...