在 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 时使用了不同的查询集(即带有过滤器)。