Менеджер модели, запросы

_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, записи запроса

# все записи таблицы
Good.objects.all()

# только 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()

get

get()

Аналогичен фильтру, только возвращает один элемент таблицы

Возбуждает исключения:

  • DoesNotExists - если записей не найдено
  • MultipleObjectsReturned - если найдено несколько записей
py()
try:
Goods.objects.get()
except Goods.DoesNotExists:
pass
except Goods.MultipleObjectsReturned:
pass

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)