Django QuerySet - Фільтр
QuerySet Фільтр
Метод filter()
використовується для фільтрації пошуку та дозволяє повертати лише ті рядки, які відповідають пошуковому терміну.
Як ми дізналися в попередньому розділі, ми можемо фільтрувати такі імена полів:
Приклад
Повертати лише ті записи, де є ім’я 'Emil':
mydata = Member.objects.filter(firstname='Emil').values()
Виконати приклад »
У SQL наведена вище інструкція буде написана так:
SELECT * FROM members WHERE firstname = 'Emil';
AND
Метод filter()
приймає аргументи як **kwargs (аргументи ключового слова), тому ви можете фільтрувати більше ніж одне поле, розділяючи їх комою.
Приклад
Повернути записи, де прізвище "Refsnes" та id 2:
mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
Виконати приклад »
У SQL наведена вище інструкція буде написана так:
SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;
OR
Повернути записи, де ім’я Emil або ім’я Tobias (що означає: повернення записів, які відповідають будь-якому запиту, не обов’язково обом) не так просто, як приклад AND вище.
Ми можемо використовувати кілька методів filter()
, розділених символом вертикальної лінії |
. Результати зливаються в одну модель.
Приклад
Повертає записи, у яких є ім’я "Emil" або Tobias":
mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
Виконати приклад »
Іншим поширеним методом є імпорт і використання виразів Q:
Приклад
Повертає записи, у яких є ім’я "Emil" або Tobias":
from django.http import HttpResponse
from django.template import loader
from .models import Member
from django.db.models import Q
def testing(request):
mydata = Member.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
template = loader.get_template('template.html')
context = {
'mymembers': mydata,
}
return HttpResponse(template.render(context, request))
Виконати приклад »
У SQL наведена вище інструкція буде написана так:
SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';
Field lookups (Пошук полів)
Django має власний спосіб визначення інструкцій SQL і умов WHERE.
Щоб уточнити пропозицію where в Django, використовуйте "Field lookups" ("Пошук полів").
Field lookups – це ключові слова, які представляють певні ключові слова SQL.
Приклад:
Use the __startswith
keyword:
.filter(firstname__startswith='L');
Це те саме, що SQL інструкція:
WHERE firstname LIKE 'L%'
Наведена вище інструкція поверне записи, де ім’я починається з 'L'.
Синтаксис пошуку полів
Усі ключові слова пошуку полів мають бути вказані разом із назвою поля, за якою слідують два (!) символи підкреслення та ключове слово.
У нашій моделі Member
інструкція буде написана так:
Приклад
Повернути записи, де firstname
починається з літери 'L':
mydata = Member.objects.filter(firstname__startswith='L').values()
Виконати приклад »
Довідник Field Lookups (пошук полів)
Список усіх ключових слів Field Lookups:
Ключове слово | Опис |
---|---|
contains | Містить фразу |
icontains | Те саме, що contains, але без урахування регістру |
date | Означає дату |
day | Означає дату (день місяця, 1-31) (для дат) |
endswith | Закінчується на |
iendswith | Те саме, що endswidth, але без урахування регістру |
exact | Точний збіг |
iexact | Те саме, що exact, але без урахування регістру |
in | Відповідає одному зі значень |
isnull | Відповідає значенням NULL |
gt | Більше ніж |
gte | Більше ніж або дорівнює |
hour | Означає годину (для дат і часу) |
lt | Менше ніж |
lte | Менше ніж або дорівнює |
minute | Означає хвилину (для дат і часу) |
month | Збігається з місяцем (для дат) |
quarter | Означає квартал року (1-4) (для дат) |
range | Збіг між |
regex | Відповідає регулярному виразу |
iregex | Те саме, що й регулярний вираз, але не враховує регістр |
second | Означає секунди (для дат і часу) |
startswith | Починається з |
istartswith | Те саме, що startswith, але без урахування регістру |
time | Означає час (для дат і часу) |
week | Відповідає номеру тижня (1-53) (для дат) |
week_day | Відповідає дню тижня (1-7) 1 – неділя |
iso_week_day | Відповідає дню тижня за стандартом ISO 8601 (1-7). 1 – понеділок |
year | Збігається з роком (для дат) |
iso_year | Відповідає року ISO 8601 (для дат) |