/ / Django - Przekształcanie kodu w zapytanie django? - python, django, postgresql

Django - Przekształcanie kodu w zapytanie django? - python, django, postgresql

Więc mam to zapytanie django, które robięjeden z moich modeli i mam dodatkowy kod Pythona, który jest używany do wykonywania dodatkowej pracy pomiędzy każdym zapytaniem. Szukam pomocy w przekształcaniu tego fragmentu kodu w jedno zapytanie django, ponieważ wiem, że powinieneś sprawić, aby baza danych wykonała większość pracy.

Kod zapytania znajduje się poniżej.

keywords = []
if query:
results = []
keywords = query.split()
for x in keywords:
res = Textbook.objects.filter(Q(class_name__icontains=x) |
Q(textbook_name__icontains=x) |
Q(author__icontains=x) |
Q(isbn__icontains=x))
if len(results) == 0:
results = res
else:
results = set(results) & set(res)

numresults = len(results)

Więc zapytanie to informacja, którą pobieram od użytkownika. Rozdzielam te informacje na słowa kluczowe i robię zapytanie dla każdego słowa kluczowego. Szukają podręczników, więc jeśli jakiekolwiek słowo, które wpisują, pasuje do isbn, tytułu, nazwy klasy lub autora książki, która jest dodawana do wyników. Jeśli jednak użyli wielu słów, dodaję go tylko do wyników, jeśli oba słowa zwrócą książkę jako zapytanie. To właśnie wyniki = set (wyniki) i set (res) ma.Jeśli bieżące wyniki i nowe zapytanie zwracają tę samą książkę zachować ją w wynikach.

Wiem, że to jest złe, więc szukam sposobu, aby to poprawić.

Odpowiedzi:

8 dla odpowiedzi № 1

Możesz wykonać dodatkowe filtry w pętli zamiast set-intersection:

keywords = []
if query:
results = []
keywords = query.split()
query = Textbook.objects.all()
for x in keywords:
query = query.filter(Q(class_name__icontains = x) | Q(textbook_name__icontains = x) | Q(author__icontains = x) | Q(isbn__icontains = x))

numresults = len(query)

Ponieważ kwerendy Django są leniwy, wywołanie SQL powinno być zakończone aż do numresults = len(query) linia