如何过滤 django-taggit 顶部标签

MSB*_*MSB 4 django filtering django-taggit

假设您有一个包含在 Django 应用程序后面运行的 User 对象的数据库,并且您希望使用它django-taggit来标记 User 对象,以便您可以使用一些方便的过滤来检索子组。

此外,您还有一个仪表板,您希望在其中显示有关已用标签的有趣统计信息,以收集有关用户中存在的子组的一些信息。

  1. 您将如何访问和显示有关 Django 应用程序中使用的前 X 个标签的信息?

  2. 如何仅访问用户对象已过滤子组的前 X 个标签?

MSB*_*MSB 6

虽然 SO 上已经有许多帖子描述了类似的问题,但其中大多数描述了解决方法或包含分散的信息。

为了使这些信息更容易找到,我将发布一个简单的概要,说明如何使用django-taggit官方支持但官方文档中未提供的功能来实现一些基本功能。

您将如何访问和显示有关 Django 应用程序中使用的前 X 个标签的信息?

为了访问和显示有关 Django 应用程序中使用的顶级标签的信息,您可以使用内置函数,most_common如下所示:

top_tags = User.tag.most_common()
Run Code Online (Sandbox Code Playgroud)

这将返回一个查询集,其中包含放置在 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
Run Code Online (Sandbox Code Playgroud)

此外,如果您只对前 3 个标签感兴趣,那么您可以像这样访问它们:

top_tags = User.tag.most_common()[:3]
Run Code Online (Sandbox Code Playgroud)

您可以将 3 替换为 X,其中 X 是您想要退回的商品数量。


如何仅访问用户对象已过滤子组的前 X 个标签?

自 2016 年 7 月 12 日起,该most_common()函数实际上有一些您可以指定的附加参数。首先,您可以指定min_count过滤掉低于特定阈值的顶部标签。使用上一个示例中的标签进行说明:

top_tags = User.tag.most_common()[:3]
Run Code Online (Sandbox Code Playgroud)

返回之前指定的所有三个标签,但使用

top_tags = User.tag.most_common(min_count=2)[:3]
Run Code Online (Sandbox Code Playgroud)

仅返回["fruits", "vegetables"]此值是因为只有 1 个用户对象被标记为candy低于min_count2 个用户对象

您可以提供的另一个参数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
        }
    )
Run Code Online (Sandbox Code Playgroud)

在这里,我们创建一个 User 对象的过滤查询集,然后将其提供给extra_filters参数以将标签搜索限制到特定子组