【问题标题】:What are "Forward Foreign Key" and "Reverse Foreign Key" in Django?Django 中的“正向外键”和“反向外键”是什么?
【发布时间】:2023-01-30 22:27:41
【问题描述】:
在阅读一些网站包括Django的select_related()和prefetch_related()相关话题时堆栈溢出,我经常看到这样的话转发外键和反向外键但我在 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)
那么,什么是转发外键和反向外键在姜戈?
【问题讨论】:
标签:
python
django
django-models
foreign-keys
django-orm
【解决方案1】:
Forward foreignKey 是与 Category 模型相关的 Product 模型,其中每个产品都必须有一个类别。反向外键是类别模型与产品模型的关系,一个类别可以有许多产品作为反向外键。
【解决方案2】:
-
转发外键意味着具有父模型外键的子模型访问父模型。
-
反向外键意味着父模型访问具有父模型外键的子模型。
因此,在您的情况下,因为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)
<转发外键>
具有父模型Category的外键的子模型Product使用obj.category访问父模型Category,如下所示:
for obj in Product.objects.all():
print(obj.category)
<反向外键>
父模型Category访问子模型Product,它具有父模型Category和obj.product_set.all()的外键,如下所示:
for obj in Category.objects.all():
print(obj.product_set.all())