Django – zwracanie pustego zbioru

QuerySet to jedna z podstawowych klas, z którą będziemy pracować w trakcie pisania aplikacji w Django. Trafiłem ostatnio na problem, w którym należało zwrócić inne wyniki w zależności od tego, czy w żądaniu do serwera przesłana została zmienna w postaci pustego łańcucha znaków czy nie została wysłana w ogóle. Drobna różnica mająca ogromne znaczenie. Aby dokładniej zobrazować zaistniały problem postaram się to opisać z przykładami:

Żądany adres http://127.0.0.1/ skutkuje zwróceniem wszystkich wyników – brak jakiegokolwiek filtrowania

Żądany adres http://127.0.0.1/?q= skutkuje brakiem wyników – filtrowanie jest, ale wyszukiwanie po pustym łańcuchu – który de facto pasuje do każdego dowolnego łańcucha znaków też zwróciłoby wszystkie wyniki – a tutaj potrzebowałem zwrócić pusty zbiór.

Żądany adres http://127.0.0.1/q=abc skutkuje zwróceniem wszystkich wyników, które w swojej treści zawierają łańcuch znaków „abc” – tutaj sprawa jest oczywista.

Ponieważ zwrócić musiałem obiekt QuerySet sprawa się komplikowała – a rozwiązaniem okazał się taki prosty kawałek kodu:


class HelloWorldViewSet(viewsets.ModelViewSet)
def get_queryset(self):
qs = super().get_queryset()
# Dobieramy się do parametrów żądania
query = self.request.query_params.get('q')
stripped_query = query.strip() if isinstance(query, str) else None
if stripped_query == '':
# Interesująca nas linijka
return qs.none()
# dodatkowe filtry, pomijane gdy stripped_query będzie None
# otrzymamy wszystkie wyniki bez filtrowania
if stripped_query:
# qs = qs.filter()
return qs

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.