Mam ListView w Django, którego metoda get_queryset () czasami musi nie zwracać żadnych wyników. Próbowałem na trzy sposoby:
return EmptyQuerySet()
return Model.objects.none()
return Model.objects.filter(pk=-1)
Każdy z nich zwraca nieco inny obiekt.
django.db.models.query.EmptyQuerySet
z atrybutem modelu ustawionym naNone
django.db.models.query.EmptyQuerySet
z atrybutem modelu ustawionym naModel
django.db.models.query.QuerySet
z atrybutem modelu ustawionym naModel
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 № 1Myś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()