Ответ
В Django ORM, ForeignKey
— это тип поля модели, который устанавливает связь «многие-к-одному» (many-to-one) между двумя моделями. Это означает, что один объект текущей модели может быть связан только с одним объектом другой модели, но один объект другой модели может быть связан со множеством объектов текущей модели. Это фундаментальный механизм для построения реляционных связей в базе данных, обеспечивающий целостность данных и предотвращающий их дублирование.
Пример:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE) # Связь с моделью Author
def __str__(self):
return self.title
В этом примере, каждая Book
связана с одним Author
через поле author
. Параметр on_delete
является обязательным и определяет поведение при удалении связанного объекта Author
. models.CASCADE
означает, что при удалении автора будут удалены и все связанные с ним книги. Другие распространённые варианты: models.PROTECT
, models.SET_NULL
, models.SET_DEFAULT
, models.DO_NOTHING
.
Ключевые особенности:
- Реляционная связь: Создает связь «многие-к-одному» на уровне базы данных.
- Индексирование: Автоматически создает индекс в базе данных для поля
ForeignKey
, что ускоряет операции JOIN. - Первичный ключ: По умолчанию ссылается на первичный ключ (
id
) связанной модели. - Обратный доступ (
related_name
): Позволяет получить доступ к связанным объектам в обратном направлении. Например, если не указанrelated_name
, можно получить все книги автора черезauthor_instance.book_set.all()
. Если указатьrelated_name='books'
, тоauthor_instance.books.all()
. - Целостность данных: Обеспечивает ссылочную целостность, предотвращая создание "висячих" ссылок.