当前位置: 首页 > 知识库问答 >
问题:

函数“prefetch_related”的各种“*lookups”参数

路伟
2023-03-14

我无法弄清楚prefetch_related('arg_set')和prefetch_related('arg')之间的区别。

有时prefetch_related不工作时,使用参数'arg'甚至'arg_set'工作。

我已经搜索了整个docs.djangoproject.com,但至少,我不能在下面两页找到相关文件。https://docs.djangoproject.com/en/2.1/ref/models/querysets/ https://docs . django project . com/ja/2.1/ref/contrib/content types/

你们中的一些人能详细说明两者的区别吗?我想阅读与此问题相关的官方文件,因此请向我展示参考链接。

提前谢谢你。

环境:windows10,python 3.7.2,django 2.1.8,sqlite3,PyCham 2019.1。

views.py

from django.shortcuts import render
from .models import Article


def index(request):
    a = Article.objects.all().select_related('user').prefetch_related('comment_set').order_by('id')  # [1]
    a = Article.objects.all().select_related('user').prefetch_related('comment').order_by('id')  # [2]

    return render(request,
                  'sns/index.html',
                  {'articles': a})

models.py

from django.db import models
from article_comment_model.settings import AUTH_USER_MODEL


class Article(models.Model):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='article_user')
    title = models.CharField(max_length=100)
    text = models.TextField()


class Comment(models.Model):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comment_user')
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    text = models.TextField()

我想很好地理解各种与prefetch _相关的参数。

共有2个答案

斜光耀
2023-03-14

prefetch_related中使用的查找名称取决于以下几个问题的答案:

    < li >关系是在您查询的模型上定义的,还是在关系的另一端定义的?

如果关系是在您正在查询的模型上定义的(Django文档称为“前向关系”),那么查找只是字段名。如果关系是在关系的另一端定义的(“向后关系”),那么查找取决于第二个问题:

  • 您是否在定义了关系的其他模型中定义了related_name

如果是,则查找是related_name。如果没有related_name,Django使用默认名称,即modelname_set用于x对多关系,模型名称用于x对一关系(均为小写)。

实际上,这意味着您的代码中的以下内容:

  • X 对多关系:
# 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')
  • X 对 1 关系:
Article.objects.prefetch_related('user')
Comment.objects.prefetch_related('article', 'user')

像上面最后两个例子那样使用prefetch_related处理x对1关系是很少见的。我们主要使用select_related,因为后者只在原始查询中创建连接,而不是发出单独的查询。但是,正如您可以在其留档末尾阅读的那样,prefetch_related有一些潜在的优势。它可以:

  • 提取筛选的查询集
  • 获取不完整的模型(通过和延迟
  • 通过预取对象执行嵌套预
宋望
2023-03-14

调用< code>prefetch_related()的参数是关系的名称。在您的情况下,这将是一个反向的< code>ForeignKey关系。正如您在文档中看到的,反向关系的名称将是< code>FOO_set,其中< code>FOO是模型的小写名称。

因此,在您的示例中,prefetch_related('comment_set') 应该是正确的。如果您指定一个related_name例如

article = models.ForeignKey(Article, on_delete=models.CASCADE, 
                            related_name='comments')

related_name将被使用而不是FOO_set,因此在这种情况下prefetch_related(“注释”)应该是有效的。

 类似资料:
  • 本文向大家介绍JavaScript的各种常见函数定义方法,包括了JavaScript的各种常见函数定义方法的使用技巧和注意事项,需要的朋友参考一下 本文详细讲述了JavaScript的各种常见函数定义方法,分享给大家供大家参考。具体分析如下: 首先看一下JavaScript最常见的四种函数定义: 用Function构造函数定义的函数,代码如下: 函数声明,这种方式也是最为常见的一种: 函数表达式,

  • 本文向大家介绍python函数的5种参数详解,包括了python函数的5种参数详解的使用技巧和注意事项,需要的朋友参考一下 (1)       位置参数,调用函数时按位置传入参数 (2)       默认参数,即在函数定义时就给出参数的值,设置默认参数时要注意两点,一是必选参数在前,默认参数在后。二是把变化小的参数放在后面可作为默认参数。具有默认参数的函数被调用时可以不传入默认参数,若需要改变默认

  • 问题内容: 我正在寻找一个总结我一直看到的NoSQL数据库主要属性的地方- 特别是MongoDB,Riak,Redis,Memcached,Membase和Cassandra。查询的类型,类型,扩展的架构/属性等。全部在内存中,溢出到磁盘,在磁盘上备份还是仅在内存中索引? 问题答案: 也许它总结了各种NoSQL数据库(您更在第一时间详细源和点)基本信息的最佳来源之一,是这个网站。除此之外,您还应该

  • 本文向大家介绍php通过各种函数判断0和空,包括了php通过各种函数判断0和空的使用技巧和注意事项,需要的朋友参考一下 函数对0的判断 对空的判断 补充:下面给大家介绍下php 语法里0不等于null为空的解决办法 今天遇到这样一个问题是这样的: php 语句里,我想判断一个值大于等于0. 我是使用 ($value !=null && $value >=0), 返回的结果为空,这点真的好奇怪。 实

  • 英特尔C编译器和/或GCC是否像2012/2013年以来的MSVC一样支持以下英特尔内部函数 如果支持这些内部函数,那么支持哪个版本(请使用编译时常量)?

  • 本文向大家介绍PHP PDO fetch 模式各种参数的输出结果一览,包括了PHP PDO fetch 模式各种参数的输出结果一览的使用技巧和注意事项,需要的朋友参考一下 PDO 的 fetch 模式功能实在是太方便了,但每次要产生想要的结果都要试太麻烦了,这里列出可能的组合。