Что такое поле ForeignKey в Django ORM?

Ответ

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