在 Django 中注释一个“selected_related”对象
Annotate a `selected_related`'d object in Django
我正在构建模型的查询集,并希望在我正在 selected_related
进入查询集的相关模型上添加注释。假设:
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
class Author(models.Model):
name = models.TextField()
我正在 selecting Book.objects.all().select_related()
,并想用 awesome=True
注释作者。我 可以 解析查询集并自己更改对象,但是是否有更清晰的面向 ORM 的方法来做到这一点?将操作反转为 select 作者是不可取的。
对此 prefetch_related
可能是更合适和干净的解决方案。
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
时使用了不同的查询集(即带有过滤器)。
我正在构建模型的查询集,并希望在我正在 selected_related
进入查询集的相关模型上添加注释。假设:
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
class Author(models.Model):
name = models.TextField()
我正在 selecting Book.objects.all().select_related()
,并想用 awesome=True
注释作者。我 可以 解析查询集并自己更改对象,但是是否有更清晰的面向 ORM 的方法来做到这一点?将操作反转为 select 作者是不可取的。
对此 prefetch_related
可能是更合适和干净的解决方案。
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
时使用了不同的查询集(即带有过滤器)。