【问题标题】:Get one related object in single request for Django ORM在 Django ORM 的单个请求中获取一个相关对象
【发布时间】:2016-04-20 01:21:53
【问题描述】:

我有这个模型

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

【问题讨论】:

  • 看看这个答案,它的作用与你想要的非常相似:stackoverflow.com/a/30650380/3955830
  • @solarissmoke 它非常接近我想要的。我想我可以用它来回答我的问题。但是,如果有任何方法可以在没有外部查询的情况下更优雅地做到这一点,这仍然很有趣。不过非常感谢

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


【解决方案1】:

* 已更新以解决 cmets *

所以粗略地说,我认为这是你会使用的:

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

【讨论】:

  • OP不想过滤当前用户喜欢的书,而是要获取所有的书,而是注释当前用户喜欢的书。
  • @solarissmoke 是对的。我想要所有书籍并注释当前用户喜欢的书籍
  • @2ps 太棒了!谢谢!
  • 我是这样设计的:Book.objects.annotate(is_liked=Case( When(like_book__user=self.request.user, then=Value(True)), default=Value(False), output_field=BooleanField()))
猜你喜欢
  • 2014-11-05
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2016-09-05
  • 2017-06-29
  • 2018-11-18
  • 1970-01-01
相关资源
最近更新 更多