在Django ORM的单个请求中获取一个相关对象

时间:2016-04-20 01:21:53

标签: python django django-models django-orm django-related-manager

我有这个模特

class Book(models.Model):
    title = models.CharField(max_length=255, blank=False, null=False)

class Like(models.Model):
    user = models.ForeignKey(User, related_name="like_user", blank=False, null=False)
    book = models.ForeignKey(Book, related_name="like_book", blank=False, null=False)
    class Meta:
        unique_together = ["user", "book"]

我想获取所有图书并检查当前用户是否在单个请求中喜欢每本书

Book.objects.select_related('like_book').all()

因为许多结果而无法工作

Book.objects.prefetch_related('like_book').all()

会缓存like_set,但它会包含本书的所有内容。不仅是这个用户的一个。

最后,我希望有其他字段is_liked

books = Book.objects.MAGIC_FETCH('like_book', user=self.request.user).all()
books[0].is_liked

1 个答案:

答案 0 :(得分:2)

*已更新以解决评论*

粗略地说,我认为这就是你要用的东西:

Book.objects.annotate(is_liked=Case(When(like__user=self.request.user, then=True), default=False))