【问题标题】:Getting most_common tags with django-taggit, ignoring certain tagged objects使用 django-taggit 获取 most_common 标签,忽略某些标记对象
【发布时间】:2015-07-28 14:57:22
【问题描述】:

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

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

Bookmark.tags.most_common()

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

【问题讨论】:

    标签: django django-taggit


    【解决方案1】:

    我在查看 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() 复制整个查询有点不安——但这似乎可行。

    【讨论】:

    • 您也可以完全覆盖默认的 most_common() 方法,如果您永远不需要它 - 将 most_common_public 重命名为 most_common。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多