21 июня 2013 г.

django: QuerySet расширяемый Manager

Приспособился использовать небольшой QuerySetManager для удобства добавления налету методов в QuerySet модели. Т.е. просто прописыванием в классе модели соответствующий QuerySet расширяется, довольно удобно, если надо писать сложные менеджеры для модели. Сам класс выглядит так:
from django.db import models

class QuerySetManager(models.Manager):
    def get_query_set(self):
        return self.model.QuerySet(self.model)

    def __getattr__(self, attr, *args):
        return getattr(self.get_query_set(), attr, *args)
Внутрь класса где-то рекомендовалось добавить полем "use_for_related_fields=True", но работает без него. Зато не работает без __getattr__, пишет: 'RelatedManager' object has no attribute 'useractive', вопреки ещё какой-то рекомендации из инета. В итоге имеем некий хак.

Используется как-то так:
class Clazz(models.Model):
    ...
    objects = QuerySetManager()
    ...
    class QuerySet(models.query.QuerySet):
        def useractive(self,date):
            return self.filter( Q(active=True) & (Q(date__isnull=True)|Q(date__gte=date)) )
И потом во вьюшках:
Clazz.objects.useractive(now).order_by('date')

Комментариев нет:

Отправить комментарий