Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ORM"&引用;vs"_&引用;当访问外键的id时_Django_Orm_Foreign Keys - Fatal编程技术网

Django ORM"&引用;vs"_&引用;当访问外键的id时

Django ORM"&引用;vs"_&引用;当访问外键的id时,django,orm,foreign-keys,Django,Orm,Foreign Keys,以这两种模式为例。当我访问此外键时,这两种方式的区别是什么: class Author(models.Model): name = models.CharField(max_length=120) class Book(models.Model): name = models.CharField(max_length=20) author= models.ForeignKey(Author) 语义上没有区别。但是具有作者id的版本将比作者id更高效 如果定义一个外键,

以这两种模式为例。当我访问此外键时,这两种方式的区别是什么:

class Author(models.Model):
    name = models.CharField(max_length=120)

class Book(models.Model):
    name = models.CharField(max_length=20)
    author= models.ForeignKey(Author)

语义上没有区别。但是具有
作者id
的版本将比
作者id
更高效

如果定义一个外键,那么实际上一次定义了两个Django字段:
fieldname
,它是对所引用模型的模型对象的引用,以及包含所引用对象的主键值的字段
fieldname\u id
。只有后者存储在数据库中(因为前者通常不能存储在数据库中)

请注意,如果要访问
.author
,通常这意味着您必须执行额外的查询,因为除非使用
.select_related(…)
显式加载,否则这些关系不会立即加载,而是延迟加载:它需要额外的数据库来获取相关的
author
对象。当然,一个额外的查询并不重要,但是如果您在
for
循环中执行此操作,那么这将导致n+1问题:您将需要1个查询来获取书籍,需要n个查询来获取每本书的作者


请注意,如前所述,有一些方法可以减少使用
prefetch\u related
select\u related
查询相关对象的次数。但这仍然会导致传输更多的数据。如果您只对
Author
的主键感兴趣,那么您可以使用
Author\u id
,这不需要额外获取。

相关(可能重复?)-如果您查看
Author.id
生成的查询,您将看到它不必要地获取整个Author模型字段“id”只有字段能享受这种优势吗?@TianchengLiu:主键(你可以有另一个主键,而不是
id
),因为这是存储在
Book
s.Thx的表中的,我知道。若使用“.”,django将查询author表,若使用“_”,它只是book表中的一个字段。
id= Book.objects.get(pk=1).author.id
id= Book.objects.get(pk=1).author_id