Бекенд на Django, Урок 8: Annotate и агрегация

preview_player
Показать описание
00:00 Django ORM Annotate
01:01 Статистика без annotate
02:00 SerializerMethodField
04:37 Разрабатываем через тестирование
09:50 Когда нужно использовать annotate
11:22 Что делает annotate
13:23 Делаем annotated queryset через тесты
14:38 Count, Case, When, then
18:22 добавляем annotate в queryset во View
19:42 Правим тесты
23:33 Rating, Делаем Avg - average через annotate
29:48 Правим тесты
32:20 Проверяем поля в тестах API View
35:10 Сложное домашнее задание 😱
Рекомендации по теме
Комментарии
Автор

Спасибо. Очень помогает, когда "понимал, понимал про annotate" и теперь в конце концов допонимался.

dodokwak
Автор

Спасибо за видео!

P.S. Есть еще пару пожеланий:
1. Хотя бы раз в 3 урока было бы неплохо проводить манипуляции с html что бы наглядно было видно для чего мы все это делали.
2. подумал, столкнувшись с этой проблемами, что если вы даете "домашку" (а это полезно), то в следующем видео ее показывали

progmain
Автор

Спасибо. Отличный урок, правда пришлось потратить весь день, чтобы разобраться, но без такой практики освоить annotate() было бы тяжелее.

RomanBog
Автор

Хм, userbookrelation__like, это как бы userbookrelation__set, только к одному полю like и мы подбираемся к лайкам через foreign key в userbookrelation модели.
А можно (но не нужно) найти юзеров которые поставили лайк и посчитать их)

Спасибо за урок

nix
Автор

Отлично, спасибо! По возможности больше "фич", "хаков" и "штучек" в коде ), этого очень не хватает при изучении, и мало кто делиться подобными вещами. Вы случайно на Java не пишите? Вот бы подобный курс по Spring MVC )

lionshg
Автор

В одном проекте удалось аннотациями-агрегациями и прочими релейтедами уменьшить кол-во SQL-запросов с 54 до 6! )))

dimuha
Автор

На ночь глядя, пришло вот такое решение последней задачи: Что-то решила discount == models.DecimalField(...), чтобы с приведением типов данных не морочиться.

dodokwak
Автор

case when then можно было бы опустить и сразу передать userbookrelation__like=True в count

kenan.recebli
Автор

Спасибо немного сложнее, но очень интересно. Жаль, что сейчас мало смотрят, но может? Нигде не могу найти ответ почему PyCharm упорно не хочет делать автоимпорт. Я уже даже и временную полную версию установил, все равно предлагает импорт только собственных моделей, а стороннее игнор. Поддержка молчит как в танке.

jimlabable
Автор

Пишу комментарий чтобы по быстрей вышли новые ролики))

dizzivoneverec
Автор

Круто, Спасибо! А почему второй 7ой урок?)

watercrow
Автор

Спасибо! Очень ценная информация. Аннотация - это красиво! Правильно ли я понял, что аннотация нужна, что бы не делать дополнительные поля в самой базе данных (лайк для каждой книги и пр.)?

rostislavmalyshev
Автор

Спасибо! 2 часа пытался впихнуть эту анатацию в серилайзер, а его надо во вью 🤦‍♂️

chillside
Автор

а как аннотировать только 1 элемент ?
например у меня есть тест, где я проверяю test_get, но с выдачей 1 элемента по id
если перед конструкцией с annotate сделать get(id=...), то выдает ошибку
нашел решение сделать через filter(id=...)
но в сериализатор передавать books[0], иначе тоже не работает

koshakpoc
Автор

Здравствуйте, спасибо за курс, также спасибо, что учите как правильно писать тесты, прививаете эту хорошую привычку нам с самого начала обучения!! У меня вопрос: оптимально ли мое решение для сложного задания, а именно, я создал булевое поле discount в модели Book, и если оно True тогда annotate считает price with discount:

Book.objects.all().annotate(price_w_discount=Case(When(discount=True, then=F('price')-100)))

price_w_discount создается в сериализаторе

endfine
Автор

press F to pay respect to the homework =)

watercrow
Автор

Почему то возникает ошибка при создании юзеров в тестах : ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "auth_user_username_key"
DETAIL: Ключ "(username)=(user1)" уже существует.

Николай-пив
Автор

тесты сериалайзера создают записи в базе данных и неудаляют их... второй раз тесты не проходят пока их не удалиш, в чём может быть проблема?

МаксГла
Автор

а если мы решаем задачу с discount-ом без сериализатора и api, то нужно созадавать метод в manager-е модели с annotate quesrySet-a? Спасибо.

dodokwak
Автор

А есть где нибудь архивчик с этим проектом?

montyputon