You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lesson22.md
+202-3Lines changed: 202 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -158,8 +158,9 @@ class Profile(models.Model):
158
158
159
159
## objects и shell
160
160
161
-
Для доступа или модификации любых данных, у каждой модели есть атрибут `objects`, который позволяет производить
162
-
манипуляции с данными. Он называется менеджер, и при желании его можно переопределить.
161
+
Для доступа или модификации любых данных, у каждой модели есть атрибут `objects`. Это **менеджер** (Manager) — специальный объект, который предоставляет интерфейс для работы с базой данных. Именно через менеджер мы вызываем методы `all()`, `filter()`, `get()`, `create()` и другие.
162
+
163
+
По умолчанию Django создаёт менеджер `objects` для каждой модели автоматически. При необходимости его можно переопределить или добавить дополнительные менеджеры (об этом подробнее в разделе "Кастомные менеджеры" ниже).
163
164
164
165
Для интерактивного использования кода используется команда
165
166
@@ -171,7 +172,7 @@ class Profile(models.Model):
171
172
172
173
Предварительно я создал несколько объектов через админку.
173
174
174
-
Для доступа к моделям их нужно импортировать:
175
+
Для доступа к моделям их нужно импортировать(после версии 5.0 больше не нужно, все модели будут доступны из коробки):
175
176
176
177
```python
177
178
from blog.models import Topic, Article, Comment
@@ -737,6 +738,204 @@ class MyAwesomModel(models.Model):
737
738
super().delete(**kwargs)
738
739
```
739
740
741
+
## Кастомные менеджеры
742
+
743
+
Как мы узнали ранее, `objects` — это менеджер модели, через который мы обращаемся к базе данных. Django позволяет создавать собственные менеджеры для добавления часто используемых запросов или изменения поведения по умолчанию.
744
+
745
+
### Зачем нужны кастомные менеджеры?
746
+
747
+
1.**Инкапсуляция часто используемых запросов** — вместо повторения `filter(status='published')` везде в коде
748
+
2.**Изменение базового QuerySet** — например, показывать только активные записи
749
+
3.**Добавление методов уровня таблицы** — операции, которые не относятся к конкретному объекту
750
+
4.**Разделение логики** — разные менеджеры для разных сценариев использования
all_objects = models.Manager() # Все, включая удалённые
917
+
918
+
defdelete(self, *args, **kwargs):
919
+
"""Мягкое удаление вместо физического"""
920
+
self.is_deleted =True
921
+
self.deleted_at = timezone.now()
922
+
self.save()
923
+
924
+
defhard_delete(self, *args, **kwargs):
925
+
"""Физическое удаление"""
926
+
super().delete(*args, **kwargs)
927
+
928
+
classMeta:
929
+
abstract =True
930
+
931
+
932
+
classArticle(SoftDeleteModel):
933
+
title = models.CharField(max_length=200)
934
+
# ...
935
+
```
936
+
937
+
> **Примечание:** В лекции 23 мы увидим пример кастомного менеджера для модели пользователя (`CustomUserManager`), который переопределяет методы `create_user()` и `create_superuser()`.
938
+
740
939
## Работа с ManyToMany
741
940
742
941
В наших моделях блога статья связана с темами через ManyToMany:
0 commit comments