我在查看 django-taggit 文档和其他代码时偶然发现了答案。您可以在模型的 tags 属性上设置自定义管理器,并使用它来添加额外的功能。
所以,以前,我的 Bookmark 模型是这样的:
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 标准 most_common() method 的副本,但添加了将 extra_filters 传递给查询集。
然后当我想要最常见的标签列表,但不包括私有书签时,我使用这个:
Bookmark.tags.most_common_public()
可能有不同的方法——例如,我对从 most_common() 复制整个查询有点不安——但这似乎可行。