2015-07-28 3 views
1

Я использую django-taggit для тегов некоторых объектов, Закладок. Закладки имеют атрибут boolean is_private.Получение тегов most_common с django-taggit, игнорирование некоторых помеченных объектов

При получении списка наиболее часто используемых тегов, я могу сделать это:

Bookmark.tags.most_common() 

Но как бы я получить наиболее часто используемые теги, игнорируя все теги на is_private Bookmarks? Если это помогает, есть менеджер Bookmark.public_objects, который возвращает не-частные закладки.

ответ

0

Я наткнулся на ответ, просматривая документы 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() - но это, похоже, работает.

+0

Вы также можете полностью переопределить метод 'most_common()' по умолчанию, если вам это никогда не понадобится - переименуйте 'most_common_public' в' most_common'. –

Смежные вопросы