我正在使用django-taggit来标记一些对象,书签。书签有一个布尔型is_private属性。
在获取最常用标签的列表时,我可以这样做:
Bookmark.tags.most_common()但是我如何获得最常用的标签,而忽略is_private书签上的所有标签呢?如果有帮助,有一个Bookmark.public_objects管理器,它只返回非私有书签。
发布于 2015-07-29 00:46:53
在浏览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()复制整个查询有点不放心--但这似乎是可行的。
https://stackoverflow.com/questions/31680023
复制相似问题