1. Класс Meta в моделях Django
Вложенный класс Meta управляет поведением модели на уровне метаданных — без влияния на структуру полей.
Ключевые опции Meta
| Опция | Назначение | Пример |
|---|---|---|
ordering |
Сортировка по умолчанию | ['-created_at'] |
verbose_name |
Имя модели в ед. числе | 'Project' |
verbose_name_plural |
Имя модели во мн. числе | 'Projects' |
unique_together |
Уникальность по нескольким полям | (('title', 'project'),) |
db_table |
Имя таблицы в БД | 'my_projects' |
class Task(models.Model):
title = models.CharField(max_length=255)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
class Meta:
ordering = ['-due_date']
verbose_name = 'Task'
verbose_name_plural = 'Tasks'
unique_together = (('title', 'project'),)
2. Поле choices
Поле choices ограничивает допустимые значения. В исходной лекции используется список кортежей. В Django 3+ рекомендуется TextChoices.
# Вариант из практикума (список кортежей — работает в Django 5.x)
STATUSES_CHOICES = [
('New', 'New'),
('In_progress', 'In_progress'),
('Completed', 'Completed'),
('Closed', 'Closed'),
('Pending', 'Pending'),
('Blocked', 'Blocked'),
]
class Task(models.Model):
status = models.CharField(
max_length=15,
choices=STATUSES_CHOICES,
default='New'
)
TextChoices (Django 3+) является предпочтительным современным способом объявления choices. Список кортежей поддерживается во всех версиях Django.
3. Validators
Встроенный MinLengthValidator проверяет минимальную длину строки на уровне Django (не только в форме, но и через full_clean()).
from django.core.validators import MinLengthValidator
class Task(models.Model):
title = models.CharField(
max_length=255,
unique=True,
validators=[MinLengthValidator(10)]
)
4. Admin-панель Django
Для каждой модели создаётся класс, унаследованный от admin.ModelAdmin. Декоратор @admin.register — современный способ регистрации.
from django.contrib import admin
from .models import Project, Task, Tag
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
list_display = ['name', 'created_at']
search_fields = ['name']
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ['title', 'project', 'status', 'priority', 'created_at', 'due_date']
search_fields = ['title']
list_filter = ['status', 'priority', 'project', 'created_at', 'due_date']
5. Admin-действия (actions)
Позволяют массово применять операции к выделенным объектам в списке Admin.
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
actions = ['change_status', 'change_priority_to_low']
def change_status(self, request, queryset):
queryset.update(status='Closed')
change_status.short_description = 'Mark as Closed'
def change_priority_to_low(self, request, queryset):
queryset.update(priority='Low')
change_priority_to_low.short_description = 'Mark as Low priority'
for obj in objects: obj.save()). Современный Django-стиль — использовать queryset.update(...) для массового обновления без лишних запросов к БД. Оба варианта корректны.
6. Property и Admin
Для отображения вычисляемых полей в Admin используют метод в ModelAdmin с short_description.
class Project(models.Model):
files = models.ManyToManyField('ProjectFile', related_name='projects')
@property
def count_of_files(self):
return self.files.count()
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
list_display = ['name', 'display_count_of_files', 'created_at']
def display_count_of_files(self, obj):
return obj.count_of_files
display_count_of_files.short_description = 'Count of Files'
7. Группы разрешений
Django имеет встроенную систему разрешений. Группы создаются в Admin → Authentication and Authorization → Groups. Каждому пользователю назначается группа.
- Флаг
is_staff=True— доступ к Admin-панели - Флаг
is_superuser=True— все разрешения без проверки - Группа — набор разрешений, назначается пользователю
8. Fixtures (снимки данных)
Fixtures позволяют сохранить и восстановить данные из БД без ручного заполнения.
# Сохранить группы разрешений
python manage.py dumpdata auth.Group --natural-foreign --indent=4 > fixtures/groups.json
# Восстановить из снимка
python manage.py loaddata fixtures/groups.json