如何过滤django-taggit顶部标签

时间:2018-06-27 02:13:15

标签: django filtering django-taggit

假设您有一个数据库,其中的User对象在Djano应用程序后运行 并且您想使用django-taggit标记用户对象,以便可以使用一些方便的过滤来检索子组。

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

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

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

1 个答案:

答案 0 :(得分:2)

尽管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]

在这里您可以用X替换3,其中X是您要退回的商品数量。


  

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

自2016年7月12日起,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,这意味着它低于2的min_count

可以为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参数,以将标签搜索限制在特定的子组中