使用来自 ManyToMany 关系的布尔值注释查询集

Annotate queryset with a boolean from ManyToMany relation

假设我有一个这样的 Book 模型:

class Book(models.Model)
    title = models.Charfield(...)
    likes = models.ManyToMany(User, related_name="books_liked")

我需要用 is_liked 字段为当前登录的用户注释一个查询集。

我在视图中有这个,但它不起作用:

    user = self.request.user
    qs = Book.objects.all().annotate(is_liked=Exists(user.books_liked.all()))
    return qs

所以我可以在模板中使用类似的东西

{% for book in books %}
    {% if book.is_liked %}
      ...
    {% endif %}
{% endfor %}

我正在查看此文档部分,但我不太确定如何继续或是否是正确的方法。

https://docs.djangoproject.com/en/3.1/ref/models/expressions/#exists-subqueries

我该怎么做?谢谢。

为了让它工作,我必须创建一个明确的 Like 模型:

class Like(models.Model):
    book = models.ForeignKey(
        Book, on_delete=models.CASCADE,
   )
    user = models.ForeignKey(
        User, on_delete=models.CASCADE,
    )

并删除 Book

上的 ManyToMany 关系

然后在视图中:

    qs = super().get_queryset()
    user_likes = Like.objects.filter(
        book=OuterRef("pk"),
        user=self.request.user
    )
    return Book.objects.annotate(
        is_liked=Exists(user_likes)
    )