注释一个“选定的”相关的“';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还支持外键和一对一关系。“谢谢!