Django落后关系会增加开销吗?

时间:2016-11-13 02:51:25

标签: python django models

在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='+'也会改变数据库模式本身?

1 个答案:

答案 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神奇工作的对象。