Django 品种在'*查找和#x27;函数的参数';预回迁相关';
我搞不清预回迁相关('arg_set')和预回迁相关('arg')之间的区别 有时,当使用参数“arg”时,与预取相关的功能不起作用,甚至“arg\u set”也起作用 我已经搜索了docs.djangoproject.com,但至少在下面的两个页面上都找不到相关文档。 你们中的一些人能详细说明一下区别以及什么时候需要设置吗? 我想阅读与这个问题相关的官方文件,所以给我看参考链接非常感谢 先谢谢你 环境: windows10、python 3.7.2、django 2.1.8、sqlite3、PyCham 2019.1 views.pyDjango 品种在'*查找和#x27;函数的参数';预回迁相关';,django,Django,我搞不清预回迁相关('arg_set')和预回迁相关('arg')之间的区别 有时,当使用参数“arg”时,与预取相关的功能不起作用,甚至“arg\u set”也起作用 我已经搜索了docs.djangoproject.com,但至少在下面的两个页面上都找不到相关文档。 你们中的一些人能详细说明一下区别以及什么时候需要设置吗? 我想阅读与这个问题相关的官方文件,所以给我看参考链接非常感谢 先谢谢你 环境: windows10、python 3.7.2、django 2.1.8、sqlite3、
从django.exe导入渲染
从。模型导入文章
def索引(请求):
a=Article.objects.all()。选择与内容相关的('user')。预取与内容相关的('comment\u set')。排序依据('id')。[1]
a=Article.objects.all()。选择与_相关的('user')。预回迁与_相关的('comment')。订购人('id')。[2]
返回渲染(请求,
“sns/index.html”,
{'articles':a})
models.py
来自django.db导入模型的
从文章\u注释\u模型。设置导入验证\u用户\u模型
类文章(models.Model):
user=models.ForeignKey(AUTH\u user\u MODEL,on\u delete=models.CASCADE,related\u name='article\u user')
title=models.CharField(最大长度=100)
text=models.TextField()
类注释(models.Model):
user=models.ForeignKey(AUTH\u user\u MODEL,on\u delete=models.CASCADE,related\u name='comment\u user')
article=models.ForeignKey(article,on_delete=models.CASCADE)
text=models.TextField()
我想很好地理解各种与预取相关的参数。调用
prefetch\u related()
的参数将是关系的名称。在您的情况下,这将是一种相反的ForeignKey
关系。如图所示,反向关系的名称将为FOO\u set
,其中FOO
是模型的小写名称
因此,在您的示例中,prefetch\u related('comment\u set')
应该是正确的。如果您想指定一个
将使用
related_name
而不是FOO_set
,因此prefetch_related('comments')
在这种情况下应该有效。调用prefetch_related()
的参数将是关系的名称。在您的情况下,这将是一种相反的ForeignKey
关系。如图所示,反向关系的名称将为FOO\u set
,其中FOO
是模型的小写名称
因此,在您的示例中,prefetch\u related('comment\u set')
应该是正确的。如果您想指定一个
将使用
相关的\u名称
而不是FOO\u集
,因此预回迁相关的('comments')
在这种情况下应该有效。在预回迁相关的
中使用的查找名称取决于几个问题的答案:
- 关系是在您要查询的模型上定义的,还是在关系的另一端定义的李>
- 您是否在定义关系的另一个模型中定义了
相关的\u名称
相关的\u名称
。如果没有相关的\u名称
,Django将使用默认名称,对于x-to-many关系使用modelname\u set
,对于x-to-one关系使用modelname
实际上,这意味着代码中包含以下内容:
- x对多关系:
- x对一关系:
prefetch\u-related
,这种情况很少见。我们通常使用select\u related
,因为后者只在原始查询中创建联接,而不是发出单独的查询。但是,正如您在文章末尾所看到的,预回迁相关的
有一些潜在的优势。它可以:
- 获取已过滤的查询集
- 获取不完整的模型(仅通过
和
延迟
)
- 通过
对象执行嵌套预取预取
预取相关的中使用的查找名称取决于几个问题的答案:
- 关系是在您要查询的模型上定义的,还是在关系的另一端定义的李>
如果关系是在您正在查询的模型上定义的(Django文档称为“转发关系”),那么查找只是字段名。如果在关系的另一端定义了关系(“向后关系”),则查找取决于第二个问题:
- 您是否在定义关系的另一个模型中定义了
相关的\u名称
如果是,则查找的是相关的\u名称
。如果没有相关的\u名称
,Django将使用默认名称,对于x-to-many关系使用modelname\u set
,对于x-to-one关系使用modelname
实际上,这意味着代码中包含以下内容:
- x对多关系:
- x对一关系:
像上面最后两个例子中那样,对x-to-one关系使用prefetch\u-related
,这种情况很少见。我们通常使用select\u related
,因为后者只在原始查询中创建联接,而不是发出单独的查询。但是,正如您在其结尾所读到的,pre
article = models.ForeignKey(Article, on_delete=models.CASCADE,
related_name='comments')
# no related names defined, using default manager name
Article.objects.prefetch_related('comment_set')
# using related names
User.objects.prefetch_related('article_user', 'comment_user')
Article.objects.prefetch_related('user')
Comment.objects.prefetch_related('article', 'user')