Что такое "Прямой внешний ключ (связь)" и "Обратный внешний ключ (связь)" в Django?

При чтении тем, связанных с Django select_related() и prefetch_related() на некоторых сайтах, включая Stack Overflow, Я часто встречаю слова Forward Foreign Key (Relationship) и Reverse Foreign Key (Relationship), но я не смог найти их определения в документации Django:

# "models.py"

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=20)

class Product(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2, max_digits=5)

Итак, что такое Forward Foreign Key (Relationship) и Reverse Foreign Key (Relationship) в Django?

Forward foreignKey - это отношение модели Product к модели Category, где каждый продукт должен иметь категорию. Обратный внешний ключ - это отношение модели категории к модели продукта, и категория может иметь много продуктов в качестве обратного внешнего ключа.

  • Forward Foreign Key означает, что дочерняя модель, имеющая внешний ключ к родительской модели, получает доступ к родительской модели.

  • Reverse Foreign Key означает, что родительская модель обращается к дочерней модели, которая имеет внешний ключ к родительской модели.

В вашем случае, поскольку Product модель имеет внешний ключ к Category модели, поэтому Category модель является родительской моделью, а Product модель является дочерней моделью, как показано ниже:

# "models.py"

from django.db import models

class Category(models.Model): # Parent model
    name = models.CharField(max_length=20)

class Product(models.Model): # Child model
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2, max_digits=5)

<Передний внешний ключ>

Дочерняя модель Product обращается к родительской модели Category с помощью obj.category, как показано ниже:

for obj in Product.objects.all():
    print(obj.category) # Here

< Обратный внешний ключ>

Родительская модель Category обращается к дочерней модели Product с помощью obj.product_set.all(), как показано ниже:

for obj in Category.objects.all():
    print(obj.product_set.all()) # Here
Вернуться на верх