Охватываемые темы: 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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!