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
Где можно использовать аннотированные поля?
Поля, добавляемые аннотированием, можно использовать не только для агрегации, но и для фильтрации с сортировкой, и даже в последующих аннотациях — везде, где можно использовать обычные поля.