Связь один к одному в Django
Связь один к одному - это когда одна запись одной таблицы соответствует одной записи другой таблицы.
Давайте посмотрим на примере. Пусть у нас есть следующая таблица с постами:
posts
- id
- title
Каждый пост имеет одну картинку-миниатюру. Картинки хранятся в отдельной таблице:
thumbnails
- id
- path
- alt
- post_id
Таблица миниатюр связана с таблицей
постов через поле post_id.
Так как одному посту соответствует
одна миниатюра, получается связь
один к одному. Мы можем прописать
эту связь в моделях. Тогда при
получении поста вместе с ним
удобно будет получать и миниатюру.
Давайте сделаем это. Создадим модель для постов:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
Создадим модель для миниатюр:
class Thumbnail(models.Model):
path = models.CharField(max_length=255)
alt = models.CharField(max_length=100)
В модели миниатюр добавим поле
связи OneToOneField.
Параметр on_delete=models.CASCADE
говорит Django: если пост удалили -
удалить и его миниатюру:
class Thumbnail(models.Model):
post = models.OneToOneField(
Post,
on_delete=models.CASCADE
)
path = models.CharField(max_length=255)
alt = models.CharField(max_length=100)
Полный код обеих моделей будет таким:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
class Thumbnail(models.Model):
post = models.OneToOneField(
Post,
on_delete=models.CASCADE
)
path = models.CharField(max_length=255)
alt = models.CharField(max_length=100)
Сделайте следующие таблицы:
employees
- id
- name
- surname
- age
contacts
- id
- phone
- employee_id
Свяжите эти таблицы отношением
один к одному через
OneToOneField.