Python 在Django ORM的单个请求中获取一个相关对象
我有这个模型Python 在Django ORM的单个请求中获取一个相关对象,python,django,django-models,django-orm,django-related-manager,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,
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。选择相关('like\u Book')。all()
因为结果太多,所以不起作用
Book.objects.prefetch\u related('like\u Book').all()
将缓存like\u set
,但它将包含本书的所有like。不只是这个用户的一个
最后,我希望有额外的字段is\u喜欢
books = Book.objects.MAGIC_FETCH('like_book', user=self.request.user).all()
books[0].is_liked
*更新以处理评论* 粗略地说,我认为这就是你要使用的:
Book.objects.annotate(is_liked=Case(When(like__user=self.request.user, then=True), default=False))
看看这个答案,它做的事情和你想要的非常相似:@solarismoke它非常接近我想要的。我想我可以用它来回答我的问题。但是,如果有任何方法可以在没有外部查询的情况下更优雅地完成这项工作,那么这仍然很有趣。但非常感谢OP不想筛选当前用户喜欢的书籍,而是要获取所有书籍,但对当前用户喜欢的书籍进行注释。@Solarismoke是正确的。我想要所有的书,并注释当前用户喜欢的书user@2ps太棒了!非常感谢。我是这样做的:
Book.objects.annotate(is_like=Case(当(like_Book__用户=self.request.user,然后=Value(True)),default=Value(False),output_字段=BooleanField())