Александр Кошелев
Александр Кошелев Python-разработчик

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

Очень часто приходится писать менеджеры для моделей, которые осуществляют фильтр 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

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

comments powered by Disqus