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 (для дат) |