/ / Puste zestawy zapytań w Django - django

Puste kwerendy w Django - django

Mam ListView w Django, którego metoda get_queryset () czasami musi nie zwracać żadnych wyników. Próbowałem na trzy sposoby:

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

Każdy z nich zwraca nieco inny obiekt.

  1. django.db.models.query.EmptyQuerySet z atrybutem modelu ustawionym na None
  2. django.db.models.query.EmptyQuerySet z atrybutem modelu ustawionym na Model
  3. django.db.models.query.QuerySet z atrybutem modelu ustawionym na Model

Tylko trzecia opcja działa z klasąListView. Inne opcje ulegają awarii w przypadku błędu atrybutu, gdy ListView próbuje uzyskać dostęp do atrybutu modelu. To mnie zaskakuje i jest bólem, ponieważ wymaga ode mnie importowania modelu w miejscach, w których może powodować problemy z MRO.

Co robię źle / co powinienem robić inaczej?

Aktualizacja: Pytanie brzmi, jaki jest właściwy sposób zwracania pustego zestawu zapytań za pomocą metody widoku klas get_queryset()?

Aktualizacja: Oto wiersz w ogólnych widokach Django, który trafia na błąd atrybutu podczas próby dostępu do model atrybut: https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166.

Odpowiedzi:

3 dla odpowiedzi № 1

Myślę, że najlepszym sposobem osiągnięcia tego jest zadzwonienie none() na objects dla danego modelu i zwróć wynik. Zakładając, że twój model ma nazwę Entry:

queryset = Entry.objects.none()