← Назад к вопросам

Как создать модель в Django?

1.0 Junior🔥 201 комментариев
#Django

Комментарии (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