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中的d对象_Django_Django Rest Framework_Django Orm - Fatal编程技术网

注释一个“选定的”相关的“';Django中的d对象

注释一个“选定的”相关的“';Django中的d对象,django,django-rest-framework,django-orm,Django,Django Rest Framework,Django Orm,我正在构建一个模型的查询集,并希望将我所选择的相关模型上的注释放入查询集中。假设: class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) class Author(models.Model): name = models.TextField() 我正在选择Book.objects.all()。选择_related(),并想用awesome=True注释

我正在构建一个模型的查询集,并希望将我所选择的相关模型上的注释放入查询集中。假设:

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

class Author(models.Model):
    name = models.TextField()   
我正在选择
Book.objects.all()。选择_related()
,并想用
awesome=True
注释作者。我可以自己解析查询集并修改对象,但是有没有更干净的面向ORM的方法呢?将操作倒置以选择作者是不可取的。

因为这可能是更合适、更干净的解决方案

from django.db import models

q = Book.objects.all().prefetch_related(
    models.Prefetch(
        "author",
        queryset=Author.objects.all().annotate(
            awesome=models.Value(
                True,
                output_field=models.BooleanField()
            )
        )
    )
)
这将导致对数据库进行两次查询,而不是使用
select_related
进行一次查询,第二次查询是在访问
.manager
时进行的,仍然总共只有两次查询,而不是为每本书添加一次查询以获取其管理器,
除非在以后访问
.manager
时使用不同的查询集(即带有过滤器)

根据模型设计,请使用预期的查询输出更新您的下一页。嗯,我完全错过了粗体部分:另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_related无法完成的,此外,select_related还支持外键和一对一关系。“谢谢!