@@ -86,22 +142,67 @@ Django QuerySet ленивы (вычисляются только при обр
-`in` (список), `range` (диапазон).
-`isnull=True`.
```python
Person.objects.filter(first_name__exact="Ivan")
Person.objects.filter(first_name__iexact="ivan")
Person.objects.filter(age__gt=18)
Person.objects.filter(age__range=(18,30))
Person.objects.filter(first_name__icontains="iv")
Person.objects.filter(id__in=[1,2,3])
Person.objects.filter(bio__isnull=True)
```
### Оптимизация запросов
-`select_related('field')` — заранее подтягивает связанную запись через `JOIN`. Подходит для `ForeignKey` и `OneToOneField`, когда у объекта есть одна связанная запись.
-`prefetch_related('field')` — делает отдельный запрос за связанными объектами и собирает их в Python. Подходит для `ManyToManyField` и обратных связей, где связанных записей может быть много.
- **Проблема N+1** — ситуация, когда Django делает один запрос за списком объектов, а потом ещё по одному запросу на каждый объект в цикле.
Пример: если вывести 100 книг и для каждой обратиться к `book.author`, без оптимизации может получиться 101 запрос. С `select_related('author')` авторы будут загружены сразу.
```python
# select_related: книга + её автор загружаются одним SQL-запросом
books=Book.objects.select_related("author")
forbookinbooks:
print(book.title,book.author.name)
```
```python
# prefetch_related: авторы загружаются отдельно, затем Django связывает их с книгами
-`aggregate(Avg('rating'))` — считает одно итоговое значение по всей выборке: среднее, сумму, минимум, максимум, количество. Возвращает словарь, а не QuerySet.
-`annotate(total=Count('entries'))` — добавляет вычисляемое поле к каждому объекту в выборке.
Пример: `Book.objects.aggregate(Avg('rating'))` вернёт средний рейтинг всех книг. `Author.objects.annotate(total=Count('books'))` добавит каждому автору поле `total` с количеством его книг.
```python
fromdjango.db.modelsimportAvg,Count
# aggregate: одно итоговое значение по всей таблице книг
title: Основы объектно-ориентированного программирования
updated: 2026-05-31
title: Основы ООП в Python
source: ["[[oop.pdf]]"]
---
@@ -15,8 +15,8 @@ source: ["[[oop.pdf]]"]
## Четыре столпа ООП
1.**Абстракция:** Выделение ключевых характеристик объекта и отсечение незначимых.
2.**Инкапсуляция:** Сокрытие внутренней логики и данных. В Python реализуется соглашением об именовании:
-`_name`: «защищенный» (не рекомендуется трогать вне класса).
-`__name`: «приватный» (имя искажается для предотвращения прямого доступа).
-`_name`: "защищенный" (не рекомендуется трогать вне класса).
-`__name`: "приватный" (имя искажается для предотвращения прямого доступа).
3.**Наследование:** Создание новых классов на базе существующих. Все классы наследуются от `object`.
4.**Полиморфизм:** Возможность использовать разные типы данных через единый интерфейс.
- *Полиморфизм подтипов:* Использование потомка вместо родителя.
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.