Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用django taggit获取最常见的标记,忽略某些标记对象_Django_Django Taggit - Fatal编程技术网

使用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文档和其他代码时偶然发现了答案。您可以在模型的标记属性上设置自定义管理器,并使用它添加额外的功能

我正在使用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