Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как создать модель в Django
Модель в Django — это класс, который описывает структуру таблицы в базе данных. Каждый атрибут класса — это поле в таблице.
Базовый пример
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
pages = models.IntegerField()
published = models.DateField()
class Meta:
ordering = ['-published']
def __str__(self):
return self.title
Это создаст таблицу с полями id, title, author, pages, published.
Основные типы полей
class Post(models.Model):
# Текстовые
title = models.CharField(max_length=100) # Короткий текст
content = models.TextField() # Длинный текст
slug = models.SlugField(unique=True) # URL-safe строка
email = models.EmailField()
url = models.URLField()
# Числовые
views = models.IntegerField(default=0)
rating = models.FloatField()
# Булевы
is_published = models.BooleanField(default=False)
# Даты и время
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
published_date = models.DateField()
# Выборы
STATUS_CHOICES = [
('draft', 'Draft'),
('published', 'Published'),
]
status = models.CharField(max_length=10, choices=STATUS_CHOICES)
Связи между моделями
# Один ко многим
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)
# Многие ко многим
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(Tag)
# Один к одному
class User(models.Model):
username = models.CharField(max_length=100)
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField()
Опции полей
class Product(models.Model):
name = models.CharField(
max_length=100,
verbose_name="Product Name",
help_text="Введите название товара"
)
price = models.DecimalField(
max_digits=10,
decimal_places=2,
default=0.00
)
description = models.TextField(null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
Методы и свойства
class User(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField(unique=True)
class Meta:
verbose_name = "User"
verbose_name_plural = "Users"
ordering = ['last_name']
def __str__(self):
return f"{self.first_name} {self.last_name}"
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
@property
def username(self):
return self.email.split('@')[0]
Создание и применение миграций
# 1. Создание миграции
python manage.py makemigrations
# 2. Просмотр SQL
python manage.py sqlmigrate app_name 0001
# 3. Применение миграции
python manage.py migrate
# 4. Проверка статуса
python manage.py showmigrations
Работа с моделью в shell
python manage.py shell
from myapp.models import Book, Author
# Create
author = Author.objects.create(name="Толстой")
book = Book.objects.create(title="Война и мир", author=author, pages=1200)
# Read
book = Book.objects.get(id=1)
all_books = Book.objects.all()
first_book = Book.objects.first()
# Update
book.title = "Война и мир (обновлено)"
book.save()
# Delete
book.delete()
Book.objects.filter(pages__lt=100).delete()
Валидация модели
from django.core.exceptions import ValidationError
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
def clean(self):
if self.price < 0:
raise ValidationError("Price cannot be negative")
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)
Индексы и оптимизация
class Article(models.Model):
title = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(unique=True)
created = models.DateTimeField(auto_now_add=True, db_index=True)
class Meta:
indexes = [
models.Index(fields=['title', 'created']),
]
Итоговый пример
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(unique=True)
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
views = models.IntegerField(default=0)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title