Django ORM Flashcards
Какая основная задача ORM?
Отображение объектов в коде на таблицы в базе данных и обратно
Как соотносятся таблицы в реляционной базе данных и модели в коде?
На каждую таблицу создается своя модель
Для чего нужны миграции?
Миграции – единственный правильный способ вносить изменения в структуру базы данных
Как соотносятся между собой объект и таблица в базе данных?
Каждый объект соответствует одной строке в таблице базы данных
Если цепочка вызовов содержит несколько вызовов .filter(), то…
условия объединятся через “AND”
Если цепочка вызовов содержит несколько вызовов .order_by(), то…
будет учтён только последний
Методы QuerySet вроде .filter() и .order_by()…
не изменяют состояние объекта QuerySet
Важен ли порядок в котором вызываются методы билдера?
Нет. Порядок определяется при формировании самого запроса внутри ORM
Как правильно построить условие WHERE
users = User.objects.filter(id\_\_in=[1, 2])
Какие способы подойдут для того, чтобы получить список всех пользователей?
users = list(User.objects.all()) --------------- users = [] for user in User.objects.all(): users.append(user)
Для чего нужно определять связи на уровне ORM?
Это позволяет получать зависимости сущностей через методы самой сущности
Если в модели A описано поле типа ForeignKey(B) и при этом не указана опция on_delete, то удаление некоторого объекта модели B, с которым связанно ненулевое количество объектов модели A…
… вызовет ошибку (данные в БД не будут затронуты)
Аннотирование и дубликаты в выдаче
а не добавляет ли OUTER JOIN, который можно заметить в примере выше, в выборку дублирующиеся элементы, если присовокупляемые сущности соотносятся с текущей как “многие к одному”? Добавляет! Более того, агрегация в таких случаях даёт неверные результаты, так как учитывает и повторяющиеся строки
Использование аннотации для подсчета без дублирования
агрегирующая функция Count имеет опцию distinct=True, которая убирает дублирование, пока вы используете только этот вид аннотаций и каждый Count используете с distinct=True
Где можно использовать аннотированные поля?
Поля, добавляемые аннотированием, можно использовать не только для агрегации, но и для фильтрации с сортировкой, и даже в последующих аннотациях — везде, где можно использовать обычные поля.
Когда требуется запросить некое итоговое вычисляемое значение (одно), что вы используете?
Когда требуется запросить некое итоговое вычисляемое значение (одно), что вы используете?
Когда требуется запросить посты блога, отсортировав по количеству комментариев, что вы используете?
аннотацию, затем .order_by()
Какое имя получит ключ словаря с результатами агрегации?
Post.objects.annotate(cmnt=Count(‘postcomment’)).aggregate(Sum(‘cmnt’))`
cmnt__sum
В роли чего можно использовать функцию atomic?
менеджера контекста
декоратора
Что произойдёт, если функцию, которая была помечена как атомарная с помощью atomic, вызвать в рамках уже созданной транзакции?
возможно будет создана точка сохранения;
изменения сразу попадут в базу при использовании некоторых СУБД
Какой из вариантов кода правильно откатывает транзакцию?
with transaction.atomic(): if not ...: rollback() ...
Если вам нужна пара полей, но не сама модель, вы возьмёте…
.values_list()
Если вам нужны не все поля, но с методами модели работать хочется, вы возьмёте…
.only()
Показать список миграций
python manage.py showmigrations