Менеджер модели, запросы¶
_set¶
-
_set
()¶ Доступ к вторичной таблице
class Category(models.Model): name = models.CharField(...) class Good(models.Model): category = models.ForeignKey( Category, on_delete=models.SET_NULL, ) Category.good_set.count()
aggregate¶
-
aggregate
() Агрегатная функция. Возвращает словарь со значениями агрегатных функции.
Позволяет:
подсчитать сумму значений поля
подсчитать среднее арифметичское значений поля
…
# количесвто значение, Count(поле, уникальные) from django.db.models import Count # среднее арифметическое значений, Avg(поле) from django.db.models import Avg # сумма значений, Sum(поле) from django.db.models import Sum # максимальное значение, Max(поле) from django.db.models import Max # минимальное значение, Min(поле) from django.db.models import Min # отклонение значений, StdDev(поле, отклонение) from django.db.models import StdDev # дисперсия значений, Variance(поле, дисперсия) from django.db.models import Variance Goods.objects.aggregate(models.Max('created'), models.Min('created')) # { 'created__max': date , 'created__min': date }
all¶
-
all
() Возвращает QuerySet, записи запроса
# все записи таблицы Post.objects.all() """ SELECT "blog_post"."id", "blog_post"."title", "blog_post"."content", "blog_post"."blog_id" FROM "blog_post" """ # только 5 элементов Good.objects.all()[:5] # записи с каким то условием Good.objects.filter(...).all()
annotate¶
-
annotate
() # models.py from django.db import models class Post(models.Model): user = models.ForeignKey("auth.User") # количесвто постов для пользователей Post.objects.values("user").annotate(Count("id")) # [{'user': 1, 'id__count': 3}, {'user': 2, 'id__count': 1} ...
count¶
-
count
() Возвращает число, количесво записей в запросе
# количесвто записей в таблице Good.objects.count() # количесвто записей в запросе после фильтрации Good.objects.filter(...).count()
create¶
-
create
() Создает и возврщает новый объект модели
good = Good.objects.create(title="some_title")
distinct¶
-
distinct
() Оставляет в запросе только уникальные записи
Good.objects.distinct() Good.objects.distinct('name', 'category__name')
earliest¶
-
earliest
() Возвращает обхект запроса с наименьшим значением параметра указанного поля
exclude¶
-
exclude
(**kwargs) Возвращает QuerySet, исключая записи, которые удовлетворяют условиям.
Аналогичен filter, только исключает записи из выборки.
# количесвто записей исключая записи с имененм Pencil Good.objects.exclude(name='Pencil').count() # все товары кроме указанных car_goods = Good.objects.exclude(category__name='car')
exists¶
-
exists
() Возвращает булево, если есть хотябы одна запис в выборке
Good.objects.exists() # True
filter¶
-
filter
(**kwargs) Возвращает QuerySet, с записями, которые удовлетворяют условиям
# количесвто записей с имененм Pencil Good.objects.filter(name='Pencil').count() # фильтруем товары по названию категории # в данном случае, будет сделан джоин связанной таблицы car_goods = Good.objects.filter(category__name='car')
first¶
-
first
() Возвращает первый элемент выборки
Good.objects.filter(name='Pencil').first() Post.objects.first() """ SELECT "blog_post"."id", "blog_post"."title", "blog_post"."content", "blog_post"."blog_id" FROM "blog_post" LIMIT 1 """
get¶
-
get
() Аналогичен фильтру, только возвращает один элемент таблицы
Возбуждает исключения:
DoesNotExists - если записей не найдено
MultipleObjectsReturned - если найдено несколько записей
-
py
()¶ - try:
Goods.objects.get()
- except Goods.DoesNotExists:
pass
- except Goods.MultipleObjectsReturned:
pass
Post.objects.get(id=1) “”” SELECT
“blog_post”.”id”, “blog_post”.”title”, “blog_post”.”content”, “blog_post”.”blog_id”
- FROM
“blog_post
- WHERE
“blog_post”.”id” = 1
“””
last¶
-
last
() Возвращает последний элемент выборки
Good.objects.filter(name='Pencil').last()
latest¶
-
latest
() Возвращает обхект запроса с наибольшим значением параметра указанного поля
order_by¶
-
order_by
()¶ Сортирует QuerySet
Good.objects.order_by('name') Good.objects.order_by('name', 'created') Good.objects.order_by('name', '-created') Good.objects.order_by('category__name', '-created')
reverse()¶
-
reverse
() Сортирует QuerySet в обратном порядке
Good.objects.order_by('name').reverse() Good.objects.order_by('name', 'created').reverse() Good.objects.order_by('name', '-created').reverse() Good.objects.order_by('category__name', '-created').reverse()
Модификаторы запроса¶
contains - значение поля должно содержать указанное нами
endswith - значение поля должно заканчиваться на указанное нами
day - значение поля должно быть равно указанному числу
exact - значение поля должно быть равно указанному
gt - значение поля должно быть больше указанного
gte - значение поля должно быть больше или равно указанному
hour - значение поля должно быть равно указанному часу
icontains - значение поля должно содержать указанное нами, без учета регистра
iendswith - значение поля должно заканчиваться на указанное нами, без учета регистра
iexact - значение поля должно быть равно указанному, без учета регистра
in - значение поля должно быть равно одному из указанных
Good.objects.filter(category__name__in=['car', 'house'])
isnull - булево, значение поля должно содержать значение
istartswith - значение поля должно начинаться с указанного нами, без учета регистра
lt - значение поля должно быть меньше указанного
Good.objects.filter(created__lt=now)
lte - значение поля должно быть меньше или равно указанному
minute - значение поля должно быть равно указанной минуте
month - значение поля должно быть равно указанному месяцу
range - значение поля должно лежать в указанном диапазоне
Good.objects.filter(created__range=(tomorrow, now))
startswith - значение поля должно начинаться с указанного нами
second - значение поля должно быть равно указанной секунде
year - значение поля должно быть равно указанному году
Good.objects.filter(created__year=now.year)
week_day - значение поля должно быть равно указанному дню недели
F¶
>>> from django.db.models import F
Объект позволяет ссылаться на значение модели
Good.objects.filter(created__lt=F('modified'))
Q¶
Критерии фильтрации
from django.db.models import Q
# записи, исключая по фильтру
Good.objects.filter(~Q(created__lt=now))
# записи по дате или категории
Good.objects.filter(
Q(created__lt=date) |
Q(category__name='car'))
# записи по дате и категории
Good.objects.filter(
Q(created__lt=date) &
Q(category__name='car'))
FAQ¶
Как склеить два QuerySet
# плохо
recent = list(posts) + list(comments)
# хорошо
from itertools import chain
recent = chain(posts, comments)