2013-04-28 3 views
2

У меня есть ListView в Django, метод get_queryset() иногда должен возвращать никаких результатов. Я попробовал три способа сделать это:Пустые запросы в Django

  1. return EmptyQuerySet()
  2. return Model.objects.none()
  3. return Model.objects.filter(pk=-1)

Каждый из этих возвращает несколько иной объект.

  1. django.db.models.query.EmptyQuerySet с атрибутом модели установлен в None
  2. django.db.models.query.EmptyQuerySet с моделью набор атрибутов для Model
  3. django.db.models.query.QuerySet с моделью набор атрибутов для Model

Только третий вариант работы с классом основанный на ListView. Другие параметры обрушиваются на ошибку атрибута, когда ListView пытается получить доступ к атрибуту model. Это меня удивляет, и это боль, поскольку мне требуется импортировать модель в местах, где это может вызвать проблемы с MRO.

Что я делаю неправильно/что я должен делать по-другому?

Обновление: Вопрос в том, является ли правильный способ вернуть пустой запрос с помощью метода представления класса get_queryset()?

Update: Вот строка в общих взглядах Джанго, который бьет ошибку атрибута при попытке получит доступ к model атрибута: https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166.

+0

Почему вы не можете использовать второй вариант, 'EmptyQuerySet' имеет атрибут модели в этом случае. –

+0

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

+0

@akshar: вы могли бы подумать, но Django по-прежнему выбрасывает ошибку Attribute в этой строке: https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166 – Erik

ответ

2

Я думаю, что лучший способ выполнить это - позвонить none() по номеру objects для вашей соответствующей модели и вернуть результат. Предполагая, что ваша модель называется Entry:

queryset = Entry.objects.none() 
Смежные вопросы