Многие к одному (ForeignKey
):
- Один объект “много” связан ровно с одним объектом “один”. Объект “один” может быть связан с несколькими объектами “много”.
- Пример: Много
Order
(заказов) могут принадлежать одномуCustomer
(клиенту).
class Customer(models.Model):
name = models.CharField(max_length=100)
# ...
class Order(models.Model):
order_number = models.CharField(max_length=20)
# Связь с Customer. В БД будет столбец customer_id
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='orders')
# ...
# Получение заказов клиента: customer_obj.orders.all()
on_delete
: Определяет действие при удалении связанного объекта (Customer
).models.CASCADE
: Удалить и все связанныеOrder
.models.PROTECT
: Запретить удалениеCustomer
, если есть связанныеOrder
(вызоветProtectedError
).models.SET_NULL
: Установитьcustomer
вNULL
(полеcustomer
должно иметьnull=True
).models.SET_DEFAULT
: Установитьcustomer
в значение по умолчанию (полеcustomer
должно иметьdefault
).models.SET(value_or_func)
: Установитьcustomer
в указанное значение или результат вызова функции.models.DO_NOTHING
: Ничего не делать (может нарушить целостность БД).
Многие ко многим (ManyToManyField
):
- Один объект может быть связан с несколькими объектами другой модели, и наоборот.
- Пример: Один
Movie
может иметь многоActor
, и одинActor
может играть во многихMovie
. - Django автоматически создает промежуточную таблицу для хранения связей.
class Actor(models.Model):
name = models.CharField(max_length=100)
# ...
def __str__(self): return self.name
class Movie(models.Model):
title = models.CharField(max_length=100)
# Связь с Actor. Поле можно размещать в любой из двух моделей.
actors = models.ManyToManyField(Actor, related_name='movies', blank=True)
# ...
def __str__(self): return self.title
# Добавление связи: movie_obj.actors.add(actor_obj)
# Удаление связи: movie_obj.actors.remove(actor_obj)
# Получение всех актеров фильма: movie_obj.actors.all()
# Получение всех фильмов актера: actor_obj.movies.all()
Один к одному (OneToOneField
):
- Каждый объект одной модели связан не более чем с одним объектом другой модели, и наоборот. Похоже на
ForeignKey
сunique=True
. - Пример:
User
(пользователь) может иметь только одинUserProfile
(профиль).
from django.contrib.auth.models import User # Встроенная модель пользователя
class UserProfile(models.Model):
# Связь с User. Часто делается primary_key=True для эффективности.
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='profile')
bio = models.TextField(blank=True)
location = models.CharField(max_length=100, blank=True)
# ...
def __str__(self): return self.user.username
# Доступ к профилю: user_obj.profile
# Доступ к пользователю из профиля: profile_obj.user
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰