2013-09-24 4 views
1

У меня есть базовый класс модели, который создает историю объекта каждый раз, когда объекты были изменены. Модель имеет поле с именем is_history. Идея состоит в том, что новый экземпляр модели создается со старыми данными каждый раз, когда модель была изменена кем-то. Новая модель со старыми данными имеет «is_history = True», потому что становится объектом истории. В администраторе изменений по умолчанию я не хочу видеть объекты истории. Я не хочу их видеть по умолчанию. Вот почему я создал нового менеджера, который перезаписывает значение по умолчанию get_query_set() и добавляет 'is_history = False'.Django QuerySet - как отключить предыдущее отфильтрованное значение

def get_query_set(self): 
    qs = super(ModelHistoryManager, self).get_query_set() 
    return qs.filter(is_history=False) 

Но я также должен иметь возможность показывать объекты истории в списке изменений редко, используя, например, админ-фильтр.

Мой вопрос: у меня есть запрос, который уже отфильтровал это значение. Но в фильтре admin я получаю отфильтрованный запрос из базового менеджера, и я хочу изменить этот фильтр с is_history = False на is_history = True или удалить фильтр для 'is_history', если пользователь хочет показать все записи - обе истории и оригинальные записи.

Любая идея?

+0

Почему бы вам не создать двух менеджеров? для администратора и не-администратора? –

+0

Как фильтровать значения в администраторе таким образом? Администратор использует стандартный диспетчер объектов. Все это происходит в контексте администратора, а не в пользовательских представлениях. –

+0

Да, я понимаю. почему бы не использовать пользовательский ящик в пользовательских представлениях? или, альтернативно, вы можете создать абстрактную модель и использовать ее в admin. расширьте его от исходного и переопределите в нем менеджер по умолчанию. –

ответ

0

Позвольте мне процитировать Джанго Docs о Custom Managers:

Если вы используете пользовательские объекты диспетчера, обратите внимание, что первый менеджер Джанго встречает (в том порядке, в котором они определены в модели) имеет особый статус. Django интерпретирует первый Менеджер, определенный в классе как «менеджер по умолчанию», а несколько частей Django (включая dumpdata) будут использовать этот Менеджер исключительно для этой модели. Как результат , рекомендуется быть осторожным в выборе менеджера по умолчанию , чтобы избежать ситуации, когда переопределение get_query_set() приводит к невозможности получить объекты, с которыми вы хотите работать.

Таким образом, вы должны сделать что-то вроде:

class MyModel(Model): 
    objects = models.Manager() # The default manager. 
    custom_manager = MyCustomManager() # This has overrided the get_query_set method 

Конечно, вы должны использовать custom_manager вместо objects если вы хотите отфильтрованные экземпляров модели

+0

Я знаю об этом. Но я должен изменить результат в зависимости от отфильтрованного значения. Если пользователь применил фильтр в этом поле, мне нужно создать новый набор запросов от второго менеджера, чтобы применить все фильтры от администратора и вернуть запрос. Если пользователь не применил какой-либо фильтр, запрос по умолчанию должен быть возвращен. Эти варианты фильтров управляются в фильтре администратора, нет в get_query_set(). –

0

Вы можете взломать его, но позвольте мне предупредить вас, что это очень плохая идея и касается внутренних деталей, которые не должны быть затронуты пользователями. Но если вы настаиваете, это сделало бы трюк:

from django.db.models.sql.where import WhereNode 
qs.query.where = WhereNode() 
Смежные вопросы