在 Django ORM 的单个请求中获取一个相关对象
Get one related object in single request for Django ORM
我有这个型号
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
* 已更新以解决评论 *
所以粗略地说,我认为这就是您要使用的:
Book.objects.annotate(is_liked=Case(When(like__user=self.request.user, then=True), default=False))
我有这个型号
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
* 已更新以解决评论 *
所以粗略地说,我认为这就是您要使用的:
Book.objects.annotate(is_liked=Case(When(like__user=self.request.user, then=True), default=False))