Пример 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