Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 品种在'*查找和#x27;函数的参数';预回迁相关';_Django - Fatal编程技术网

Django 品种在'*查找和#x27;函数的参数';预回迁相关';

Django 品种在'*查找和#x27;函数的参数';预回迁相关';,django,Django,我搞不清预回迁相关('arg_set')和预回迁相关('arg')之间的区别 有时,当使用参数“arg”时,与预取相关的功能不起作用,甚至“arg\u set”也起作用 我已经搜索了docs.djangoproject.com,但至少在下面的两个页面上都找不到相关文档。 你们中的一些人能详细说明一下区别以及什么时候需要设置吗? 我想阅读与这个问题相关的官方文件,所以给我看参考链接非常感谢 先谢谢你 环境: windows10、python 3.7.2、django 2.1.8、sqlite3、

我搞不清预回迁相关('arg_set')和预回迁相关('arg')之间的区别

有时,当使用参数“arg”时,与预取相关的功能不起作用,甚至“arg\u set”也起作用

我已经搜索了docs.djangoproject.com,但至少在下面的两个页面上都找不到相关文档。

你们中的一些人能详细说明一下区别以及什么时候需要设置吗? 我想阅读与这个问题相关的官方文件,所以给我看参考链接非常感谢

先谢谢你

环境: windows10、python 3.7.2、django 2.1.8、sqlite3、PyCham 2019.1

views.py

从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')
在这种情况下应该有效。

预回迁相关的
中使用的查找名称取决于几个问题的答案:

  • 关系是在您要查询的模型上定义的,还是在关系的另一端定义的
如果关系是在您正在查询的模型上定义的(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
,因为后者只在原始查询中创建联接,而不是发出单独的查询。但是,正如您在文章末尾所看到的,
预回迁相关的
有一些潜在的优势。它可以:

  • 获取已过滤的查询集
  • 获取不完整的模型(仅通过
    延迟
  • 通过
    预取
    对象执行嵌套预取

在与
预取相关的
中使用的查找名称取决于几个问题的答案:

  • 关系是在您要查询的模型上定义的,还是在关系的另一端定义的
如果关系是在您正在查询的模型上定义的(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')