【问题标题】:How to filter django-taggit top tags如何过滤 django-taggit 顶部标签
【发布时间】:2018-12-05 19:22:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: django filtering django-taggit


    【解决方案1】:

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

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

    您将如何访问和显示有关前 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 对象的子组?

    自 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
            }
        )
    

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


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多