1. Метод __str__ в Django
Магический метод __str__ возвращает строку, которая представляет объект модели. Обычно в этом методе возвращают важное или уникальное поле, которое поможет однозначно идентифицировать объект.
Без метода __str__ объекты в административной панели отображаются как Book object (1), Book object (2) и т.д. — это неинформативно. После добавления метода отображение становится читаемым.
Пример: модель Book с __str__
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()
def __str__(self):
return f"{self.title} by {self.author}"
Теперь при добавлении книг через Admin и при печати они отображаются как:
1984 by George OrwellPride and Prejudice by Jane AustenMoby-Dick by Herman Melville
Почему важен метод __str__
- Удобство отображения в административной панели: Admin использует __str__ для отображения объектов. Без него — "ModelName object (1)".
- Улучшение читаемости логов и сообщений об ошибках: при отладке легко понять, какой именно объект был использован.
- Читаемость в консольных и других текстовых выводах: при использовании
print()или Django shell.
2. Класс Meta
Класс Meta — вложенный класс внутри модели Django. Мета-данные помогают контролировать поведение модели: задавать имя таблицы, порядок сортировки, человекочитаемые имена и другие параметры.
Основные атрибуты класса Meta
| Атрибут | Назначение |
|---|---|
db_table |
Задает имя таблицы в БД (по умолчанию Django генерирует как <app>_<model>) |
ordering |
Определяет порядок сортировки записей. Префикс - — по убыванию |
verbose_name |
Человекочитаемое имя модели (ед. число) |
verbose_name_plural |
Человекочитаемое множественное число имени модели |
get_latest_by |
Задает поле, по которому определяется последняя запись (используется с DateField/DateTimeField) |
default_related_name |
Определяет имя обратной связи для ForeignKey и других связанных полей |
unique_together |
Задает комбинации полей, которые должны быть уникальными. Устарело в Django 4.2+ — используйте constraints |
indexes |
Список индексов для модели — более гибкий способ по сравнению с db_index=True |
constraints |
Список ограничений на уровне базы данных (UniqueConstraint, CheckConstraint) |
Пример использования класса Meta
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()
class Meta:
db_table = 'library_book' # Имя таблицы в БД
ordering = ['-published_date'] # Сортировка по убыванию даты
verbose_name = 'fiction book' # Имя в ед. числе
verbose_name_plural = 'fiction books' # Имя во мн. числе
unique_together = ('title', 'author') # Устарело — см. constraints
get_latest_by = 'published_date' # Поле для latest()
indexes = [
models.Index(fields=['title', 'author']),
models.Index(fields=['published_date'], name='published_idx'),
]
unique_together используйте constraints с UniqueConstraint:
from django.db.models import UniqueConstraint
class Meta:
constraints = [
UniqueConstraint(fields=['title', 'author'], name='unique_title_author'),
]
Атрибут default_related_name
Определяет имя обратной связи для ForeignKey и других связанных полей:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
class Meta:
default_related_name = 'books'
# Использование: author.books.all() вместо author.book_set.all()
3. Административная панель Django
Административная панель Django — мощный инструмент для управления данными через удобный веб-интерфейс. Все, что нужно — зарегистрировать модель и создать суперпользователя.
Настройка отображения моделей (ModelAdmin)
Чтобы настроить отображение модели в Admin, создается класс, наследуемый от admin.ModelAdmin. Этот класс позволяет настроить список отображаемых полей, фильтры, поиск и многое другое.
Основные атрибуты ModelAdmin
list_display
Определяет поля, которые будут отображаться в списке объектов модели.
list_display = ('title', 'author', 'published_date')
В списке объектов модели Book будут отображаться столбцы title, author и published_date.
search_fields
Задает поля, по которым будет производиться поиск. В Admin появится строка поиска.
search_fields = ('title', 'author__name')
Если поле — внешний ключ, нужно указывать конкретное поле через __, например author__name, а не просто author.
list_filter
Добавляет боковые фильтры для быстрой фильтрации по указанным полям.
list_filter = ('author', 'published_date')
ordering
Определяет порядок сортировки объектов в Admin. Независим от Meta.ordering.
ordering = ('-author', 'title',)
fields
Определяет порядок и набор полей, отображаемых в форме редактирования объекта.
fields = ('author', 'title', 'published_date')
list_per_page
Определяет количество объектов на одной странице в списке (по умолчанию 100).
list_per_page = 25
Полный пример класса BookAdmin
from django.contrib import admin
from .models import Book
class BookAdmin(admin.ModelAdmin):
# Колонки в списке объектов
list_display = ('title', 'author', 'published_date')
# Поиск по названию и имени автора
search_fields = ('title', 'author__name')
# Боковые фильтры
list_filter = ('author', 'published_date')
# Сортировка
ordering = ('-author', 'title',)
# Поля в форме редактирования
fields = ('author', 'title', 'published_date')
# Количество записей на странице
list_per_page = 25
# Регистрация модели с настройками
admin.site.register(Book, BookAdmin)
4. Регистрация модели в Admin
Существуют два равнозначных способа регистрации модели в Admin:
Способ 1: admin.site.register (традиционный)
from django.contrib import admin
from .models import Book
# Простая регистрация без настроек
admin.site.register(Book)
# Или с классом настроек
admin.site.register(Book, BookAdmin)
Способ 2: декоратор @admin.register (современный, рекомендуемый)
Декоратор делает код более компактным и читаемым, особенно при регистрации множества моделей:
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'published_date')
search_fields = ('title', 'author__name')
list_filter = ('author', 'published_date')
ordering = ('-author', 'title')
fields = ('author', 'title', 'published_date')
list_per_page = 25
@admin.register. Оба способа работают одинаково — выбор зависит от предпочтений команды.
5. Создание суперпользователя
Для доступа к Admin нужен суперпользователь. Создаётся через команду manage.py:
python manage.py createsuperuser
Django запросит имя пользователя, email и пароль. После создания Admin доступен по адресу http://127.0.0.1:8000/admin/.