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

时间:2021-02-07 03:08:03

标签: django django-models django-queryset

假设我有一个像这样的 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

我该怎么做?谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

并删除 ManyToMany

上的 Book 关系

然后在视图中:

    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)
    )