Многие к одному (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

〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰