Что такое "Прямой внешний ключ (связь)" и "Обратный внешний ключ (связь)" в 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