首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-taggit获取most_common标记,忽略某些标记的对象

使用django-taggit获取most_common标记,忽略某些标记的对象
EN

Stack Overflow用户
提问于 2015-07-28 22:57:22
回答 1查看 439关注 0票数 1

我正在使用django-taggit来标记一些对象,书签。书签有一个布尔型is_private属性。

在获取最常用标签的列表时,我可以这样做:

代码语言:javascript
复制
Bookmark.tags.most_common()

但是我如何获得最常用的标签,而忽略is_private书签上的所有标签呢?如果有帮助,有一个Bookmark.public_objects管理器,它只返回非私有书签。

EN

回答 1

Stack Overflow用户

发布于 2015-07-29 00:46:53

在浏览django-taggit文档和代码时,我偶然发现了答案。您可以在模型的tags属性上设置一个自定义管理器,并使用它来添加额外的功能。

所以,以前,我的Bookmark模型是这样的:

代码语言:javascript
复制
from django.db import models
from taggit.managers import TaggableManager

class Bookmark(models.Model):
    # Other attributes here
    tags = TaggableManager

我现在将其更改为:

代码语言:javascript
复制
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中,我有这样的代码:

代码语言:javascript
复制
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传递给查询集的功能。

然后,当我想要最常用的标签列表,但不包括私有书签时,我使用以下代码:

代码语言:javascript
复制
Bookmark.tags.most_common_public()

可能有一种不同的方法--例如,我对从most_common()复制整个查询有点不放心--但这似乎是可行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31680023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档