💻 Примеры: Admin, __str__, Meta

⚡ Ключевые примеры

# models.py
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.title} by {self.author}"

    class Meta:
        ordering = ['-published_date']
        verbose_name = 'книга'

# admin.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'published_date')
    search_fields = ('title',)
    list_filter = ('published_date',)
    list_per_page = 25

Пример 1: Модель с __str__ (из лекции)

Базовая модель Book из лекции с методом __str__:

# library/models.py
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:

  • До: Book object (1), Book object (2)
  • После: 1984 by George Orwell, Pride and Prejudice by Jane Austen

Пример 2: Класс Meta (из лекции)

Расширенная модель Book с полным набором атрибутов Meta:

# library/models.py
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}"

    class Meta:
        db_table = 'library_book'                  # Имя таблицы в БД
        ordering = ['-published_date']             # Сортировка по убыванию даты
        verbose_name = 'fiction book'              # Имя в ед. числе
        verbose_name_plural = 'fiction books'      # Имя во мн. числе
        unique_together = ('title', 'author')      # Устарело — см. пример 3
        get_latest_by = 'published_date'
        indexes = [
            models.Index(fields=['title', 'author']),
            models.Index(fields=['published_date'], name='published_idx'),
        ]

Пример 3: Modern Meta с constraints (Django 5.x)

Современный вариант — unique_together заменён на UniqueConstraint:

from django.db import models
from django.db.models import UniqueConstraint

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}"

    class Meta:
        db_table = 'library_book'
        ordering = ['-published_date']
        verbose_name = 'fiction book'
        verbose_name_plural = 'fiction books'
        get_latest_by = 'published_date'
        indexes = [
            models.Index(fields=['title', 'author']),
            models.Index(fields=['published_date'], name='published_idx'),
        ]
        constraints = [
            UniqueConstraint(
                fields=['title', 'author'],
                name='unique_title_author'
            ),
        ]

Пример 4: BookAdmin — все атрибуты (из лекции)

# library/admin.py
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')
    # Сортировка в Admin (независима от Meta.ordering)
    ordering = ('-author', 'title',)
    # Поля и порядок в форме редактирования
    fields = ('author', 'title', 'published_date')
    # Объектов на одной странице
    list_per_page = 25

Пример 5: Admin с ForeignKey (Author → Book)

Модели со связью и настройкой default_related_name:

# library/models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

    def __str__(self):
        return f"{self.title} by {self.author}"

    class Meta:
        default_related_name = 'books'  # author.books.all() вместо author.book_set.all()

# library/admin.py
from django.contrib import admin
from .models import Author, Book

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'published_date')
    search_fields = ('title', 'author__name')    # Поиск по имени автора через FK
    list_filter = ('author', 'published_date')
    list_per_page = 25

Пример 6: Применение в Менеджере задач (ДЗ 9)

Структура для домашнего задания — модели Task, SubTask, Category:

# task_manager/models.py
from django.db import models
from django.db.models import UniqueConstraint

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'task_manager_category'
        verbose_name = 'Category'
        constraints = [
            UniqueConstraint(fields=['name'], name='unique_category_name'),
        ]


class Task(models.Model):
    STATUS_CHOICES = [
        ('new', 'Новая'),
        ('in_progress', 'В работе'),
        ('done', 'Выполнена'),
    ]
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    categories = models.ManyToManyField(Category, blank=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='new')
    deadline = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'task_manager_task'
        ordering = ['-created_at']
        verbose_name = 'Task'
        constraints = [
            UniqueConstraint(fields=['title'], name='unique_task_title'),
        ]


class SubTask(models.Model):
    title = models.CharField(max_length=200)
    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='subtasks')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'task_manager_subtask'
        ordering = ['-created_at']
        verbose_name = 'SubTask'
        constraints = [
            UniqueConstraint(fields=['title'], name='unique_subtask_title'),
        ]
# task_manager/admin.py
from django.contrib import admin
from .models import Task, SubTask, Category

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
    list_display = ('title', 'status', 'deadline', 'created_at')
    search_fields = ('title', 'description')
    list_filter = ('status', 'categories')
    ordering = ('-created_at',)
    list_per_page = 25

@admin.register(SubTask)
class SubTaskAdmin(admin.ModelAdmin):
    list_display = ('title', 'task', 'created_at')
    search_fields = ('title',)
    list_filter = ('task',)
    ordering = ('-created_at',)
    list_per_page = 25