Я наткнулся на ответ, просматривая документы django-taggit и код для чего-то еще. Вы можете установить собственный менеджер в атрибуте tags
вашей модели и использовать его для добавления дополнительных функций.
Так, ранее, моя модель Закладка была эта:
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'. –