📝 Django

Связи между моделями Django

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
278
🌿
Уровень
Средний

Охватываемые темы: ForeignKey (один ко многим), on_delete варианты, ManyToManyField (многие ко многим), OneToOneField (один к одному).

ForeignKey (один ко многим)

class Project(models.Model):
    name = models.CharField(max_length=200)

class Task(models.Model):
    project = models.ForeignKey(
        Project,
        on_delete=models.CASCADE,    # удалить задачи при удалении проекта
        related_name='tasks',         # project.tasks.all()
        null=True, blank=True,
    )
    title = models.CharField(max_length=200)
project = Project.objects.get(pk=1)
tasks = project.tasks.all()           # обратная связь

task = Task.objects.get(pk=1)
print(task.project.name)              # прямая связь

on_delete варианты

Параметр Поведение
CASCADE Удалить связанные объекты
SET_NULL Поставить NULL (нужен null=True)
SET_DEFAULT Поставить default
PROTECT Запретить удаление (исключение)
DO_NOTHING Ничего не делать

ManyToManyField (многие ко многим)

class Tag(models.Model):
    name = models.CharField(max_length=50)

class Task(models.Model):
    title = models.CharField(max_length=200)
    tags = models.ManyToManyField(Tag, blank=True, related_name='tasks')
task = Task.objects.get(pk=1)
task.tags.add(tag)             # добавить тег
task.tags.remove(tag)          # убрать тег
task.tags.set([tag1, tag2])    # заменить
task.tags.all()                # все теги задачи

tag.tasks.all()                # все задачи с тегом

OneToOneField (один к одному)

from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    bio = models.TextField(blank=True)
    avatar = models.ImageField(upload_to='avatars/', blank=True)
user = User.objects.get(pk=1)
print(user.profile.bio)          # прямой доступ

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Поиск в Django

Поиск в Django можно начать с простых ORM-фильтров, а для ранжирования и полнотекстового поиска использовать...

📅 30.06.2026 👁️ 279
📝

Swagger документация с drf-spectacular

drf-spectacular генерирует OpenAPI 3.0 схему и Swagger UI для DRF.

📅 30.06.2026 👁️ 561
📝

settings.py: настройки Django

settings.py — центральный конфигурационный файл Django-проекта.

📅 30.06.2026 👁️ 315
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

Django RequestLab: от HTTP до безопасного продакшена Открыть программу курса