Не фильтруйте в CustomManager.get_query_set ()! Но как насчет all (), get (), filter (), exclude ()? - PullRequest
2 голосов
/ 17 мая 2009

Документация менеджера django содержит параграф, перезаписанный DO NOT FILTER AWAY ANY RESULTS IN THIS TYPE OF MANAGER SUBCLASS, но в следующем тексте упоминается только get_query_set()

Сохраняется ли фильтрация во всех (), get (), filter (), exclude ()?

Причина, по которой я хочу это сделать: мне нужен автоматический Менеджер, так как он дает мне возможность контролировать, какие строки отправляются в шаблон-тег, как описано в b-list: лучше писать теги шаблонов

Будет ли этот код в порядке?

class ArticleMananger(models.Manager):
    def get_query_set(self):
        return super(ArticleMananger, self).get_query_set()
    def all(self): 
        return super(ArticleMananger, self).filter(published=True)   
    def filter(self,  **kwargs):
        return super(ArticleMananger, self).filter(published=True).filter(**kwargs) 
    .... 

Редактировать: Если кто-то проголосует, было бы неплохо или просто объяснить, почему. Что не так в этом вопросе?

Ответы [ 3 ]

3 голосов
/ 17 мая 2009

Я думаю, это предупреждение только для того, чтобы не переопределять метод get_query_set () в ваших моделях. Подкласс менеджера без дальнейшего рассмотрения использования этого метода самим Джанго, если этот менеджер получает менеджер по умолчанию (объектов) вашей модели , В противном случае вы можете испытать трудности с отладкой поведения.

Попробуйте добавить операторы печати в переопределенные методы, чтобы узнать, когда и как часто они используются другими приложениями (например, приложением администратора).

1 голос
/ 18 мая 2009

Основная идея заключается в том, что если вы измените способ, которым менеджер по умолчанию для вашей модели извлекает объекты обычными методами, такими как all() или filter(), вы в конечном итоге столкнетесь с ситуацией, в которой вы захотите получить какой-то конкретный объект, но не могу. Часто это будет трудно диагностировать, потому что это может оказаться как таинственно не появляющиеся объекты, или DoesNotExist исключений, когда вы их не ожидали.

Пока у вас есть менеджер по умолчанию, который может извлекать все нормально, все же нормально делать пользовательские вещи в других менеджерах того же класса.

0 голосов
/ 17 мая 2009

Я провел тест и отвечу на свой вопрос:

Не фильтровать все (), ... тоже!

Я только что попробовал. Это ломает части интерфейса администратора. С технической точки зрения можно было бы перезаписать / расширить шаблон / admin / apps / * для использования другого менеджера (то есть с помощью собственных тегов), но я прихожу к выводу, что это не стоит работы. Вместо этого я перепишу свои теги примерно так:

def render(self, context):
    if hasattr(self.model, 'publicmgr'):
        context[self.varname] = self.model.publicmgr.all().order_by(self.by)[:self.num]
    else:
        context[self.varname] =   self.model._default_manager.all().order_by(self.by)[:self.num]
    return  ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...