假设您有一个用户对象运行在Djano应用程序后面的数据库,并且希望使用django-taggit标记用户对象,这样就可以使用一些方便的筛选来检索子组。
此外,您还有一个仪表板,您希望在其中显示有关使用过的标记的有趣统计信息,以收集用户中存在的子组的一些信息。
发布于 2018-06-27 02:13:14
虽然已经有一些文章描述了类似的问题,但其中大多数描述了解决办法,或者包含了分散的信息。
为了更容易地找到这些信息,我将简单地介绍如何使用django-taggit的一些特性来实现一些基本功能,这些特性是官方支持的,但在正式文档中是而不是。
如何访问和显示Django应用程序中使用的顶级X标记的信息?
为了访问和显示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]其中,可以用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"],这是因为只有一个用户对象被标记为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参数,以将标记搜索限制在特定的子组中。
https://stackoverflow.com/questions/51053595
复制相似问题