在Django中,您可以创建模型,并可以选择在字段上指定外键
class Man:
...
class Dog:
...
owner = models.ForeignKey(Man, on_delete=models.SET_NULL)
然后,您可以查询每个Dog
的相应所有者,或者让所有狗获得Man
owner = some_dog.owner
all_dogs = some_man.dog_set.all()
如果您不想创建the docs指定的后向关系,可以执行
class Man:
...
class Dog:
...
owner = models.ForeignKey(Man, on_delete=models.SET_NULL, related_name='+')
现在您无法再访问all_dogs = some_man.dog_set.all()
。
但是,这个额外的"建筑"后向关系增加了开销?
如果我从未使用过all_dogs = some_man.dog_set.all()
,那么是否重要
我在related_name='+'
中指定了Dog
?是否会减慢潜在的速度?
这个功能是纯粹在应用程序端Django中实现的,还是related_name='+'
也会改变数据库模式本身?
答案 0 :(得分:4)
但是,这种后向关系的额外“构建”会增加开销吗?
没有
如果我从未使用过all_dogs = some_man.dog_set.all(),那么我是否在Dog中指定了related_name ='+'是否重要?是否会减慢潜在的速度?
不,不。
这个功能是纯粹在应用程序端Django中实现的,还是related_name ='+'也会改变数据库模式本身?
它是用Python descriptors实现的。在ForeignKey
的情况下,这是ReverseManyToOneDescriptor
。
数据库架构没有变化,相关名称的存在与否不会生成迁移。
如果您尚未禁用关系,则实际上应该将描述符对象视为模型类的属性。像这样:
>>> Dog.owner
<django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor at 0x105db25d0>
>>> Man.dog_set
<django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor at 0x105db27d0>
这些是使Django的ORM神奇工作的对象。