使用django taggit获取最常见的标记,忽略某些标记对象
我正在使用django taggit标记一些对象和书签。书签具有布尔使用django taggit获取最常见的标记,忽略某些标记对象,django,django-taggit,Django,Django Taggit,我正在使用django taggit标记一些对象和书签。书签具有布尔is_private属性 获取最常用标记的列表时,我可以执行以下操作: Bookmark.tags.most_common() 但是,忽略is\u private书签上的所有标记,我如何获得最常用的标记?如果有用的话,还有一个Bookmark.public_objects管理器,它只返回非私有书签。我在查看django taggit文档和其他代码时偶然发现了答案。您可以在模型的标记属性上设置自定义管理器,并使用它添加额外的功能
is_private
属性
获取最常用标记的列表时,我可以执行以下操作:
Bookmark.tags.most_common()
但是,忽略
is\u private
书签上的所有标记,我如何获得最常用的标记?如果有用的话,还有一个Bookmark.public_objects
管理器,它只返回非私有书签。我在查看django taggit文档和其他代码时偶然发现了答案。您可以在模型的标记
属性上设置自定义管理器,并使用它添加额外的功能
因此,以前,我的书签模型有:
from django.db import models
from taggit.managers import TaggableManager
class Bookmark(models.Model):
# Other attributes here
tags = TaggableManager
我现在将其更改为:
from django.db import models
from taggit.managers import TaggableManager
from .managers import _BookmarkTaggableManager
class Bookmark(models.Model):
# Other attributes here
tags = TaggableManager(manager=_BookmarkTaggableManager)
然后在myapp/managers.py
中,我有以下内容:
from django.db import models
from taggit.managers import _TaggableManager
class _BookmarkTaggableManager(_TaggableManager):
def most_common_public(self):
extra_filters = {'bookmark__is_private': False}
return self.get_queryset(extra_filters).annotate(
num_times=models.Count(self.through.tag_relname())
).order_by('-num_times')
这个most_common_public()
方法是django taggit标准的副本,但是添加了将该extra_过滤器传递到查询集的功能
然后,当我想要列出最常见的标记(但不包括私人书签)时,我会使用以下方法:
Bookmark.tags.most_common_public()
可能有一种不同的方法——例如,我对从most_common()
复制整个查询有点不安——但这似乎是可行的。您也可以完全覆盖默认的most_common()
方法,如果您永远不需要它,请将most\u common\u public
重命名为most\u common
。