📝 Django

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

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

Охватываемые темы: 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)

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

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

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

🔗 Похожие

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

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

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 138
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 88
📝

Django: Статические файлы

Статические файлы — CSS, JavaScript, изображения, шрифты. Django обрабатывает их особым образом: в разработке раздаёт...

📅 30.06.2026 👁️ 79

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!