1. ruguevara

    15.11.2008

    0 ↑
    0 ↓
    А как можно сделать прицепляемые кастомные методы для кастомной фильтрации и последующей кастомной же сортировки? (кастомная сортировка сначала подцепляет доп. таблицы которые нужны сугубо только для этой сортировки)

    Чтобы было вот так:
    entities = Entity.faceted().by_region(region).by_topic(topic).sorted_by_activity()
    Entity.faceted — это кастомный менеджер.

    Нужно ли в методах кастомного менеджера заставлять возвращать отфильтованного себя же, а не QuerySet?

    Либо надо вдобавок к кастомному менеджеру сделать кастомный QuerySet, из менеджера возвращать именно его, а все методы кастомной фильтрации и сортировки сделать в этом кастомном QuerySet-е?
  2. Либо надо вдобавок к кастомному менеджеру сделать кастомный QuerySet, из менеджера возвращать именно его, а все методы кастомной фильтрации и сортировки сделать в этом кастомном QuerySet-е?

    Именно так будет максимально правильно.

  3. Entity.faceted()

    Если это менеджер, то скобка зачем?)

  4. ruguevara

    15.11.2008

    0 ↑
    0 ↓
    Да, скобки там нет, должно быть так:
    entities = Entity.faceted.by_region(region).by_topic(topic).sorted_by_activity()
  5. ruguevara

    15.11.2008

    0 ↑
    0 ↓
    Уже нашёл в буржуйском форуме что некто делает так кастомным QuerySet-ом и сделал. Элементарно всё, только нужно для каждого такого случая создавать еще и почти пустой кастомный менеджер. Если нужно будет такое для другой модели, сделаю что-то вроде:

    # где-то:
    class QuerySetManager(models.Manager):
    def __init__(self,queryset_class):
    super(QuerySetMagager,self).__init__()
    self.queryset_class = queryset_class

    def get_query_set(self):
    return self.queryset_class(self.model)
    # в моделях:
    class EntityQuerySet(QuerySet):
    # тут прицепляемые (chained) кастомные методы для фильтрации и сортировки
    # ...


    class Entity(models.Model):
    # ...
    objects = QuerySetManager(EntityQuerySet)
  6. Вот-вот.

    Не забывайте также тегом [code] пользоваться.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.