Ответ
В 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(). - Целостность данных: Обеспечивает ссылочную целостность, предотвращая создание "висячих" ссылок.