Универсальный менеджер

Очень часто приходится писать менеджеры для моделей, которые осуществляют фильтр query_set'a по одному или нескольким заранее известным полям. Ну например менеджер для активных/не активных статей и т.п.

Код самого менеджера очень прост:

from django.db import models

class GenericManager( models.Manager ):
    """
    Filters query set with given selectors
    """
    def __init__(self, **kwargs):
        super( GenericManager, self ).__init__()
        self.selectors = kwargs

    def get_query_set(self):
        return super( GenericManager, self ).get_query_set().filter( **self.selectors )

Теперь небольшой пример использования:

class Entry( models.Model ):
    #...
    active = models.BooleanField( default = True )

    #managers
    objects = models.Manager() # default manager must be always on first place! It's used as default_manager
    active_objects = GenericManager( active = True ) # only active entries
    inactive_objects = GenericManager( active = False ) # only inactive entries

Сам пользуюсь. Очень удобно.

Комментарии 3

  1. Igorek написал:

    Пытаюсь использовать ваш менеджер, но при попытке вызова

    from meguk.goods.models import Product e = Product.active objects.all() Traceback (most recent call last): File "", line 1, in File "C:\Python\lib\site-packages\django\db\models\manager.py", line 54, in all return self.get query set() File "C:\srv\meguk..\meguk\utils\m2m.py", line 15, in get query set return super(ActiveManager, self).get query set(**self.selectors) TypeError: get query_set() got an unexpected keyword argument 'active'

    Используется django-trunk svn 6914

    PS. Но сама суть работы модели мне очень нравится

    Оставлен 12 Декабрь 2007 в 20:03
  2. Александр Кошелев написал:

    Да, прошу прощения, немного наврал с исходником. Уже поправил пост. Пользуйтесь:)

    Оставлен 12 Декабрь 2007 в 22:08
  3. Igorek написал:

    Благодарю

    Оставлен 12 Декабрь 2007 в 22:45