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