1

У меня есть эти моделиПолучить один, связанный объект в одном запросе для 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 
+1

Посмотрите на этот ответ, который делает что-то очень похожее на то, что вы хотите: http://stackoverflow.com/a/30650380/3955830 – solarissmoke

+0

@solarissmoke очень близко к тому, что я хочу. Думаю, я мог бы использовать его в качестве ответа на мой вопрос. Но все же интересно, если это любой способ сделать это более элегантным без внешнего запроса. Но большое спасибо –

ответ

2

* Обновлены обратиться комментарии *

Так грубо говоря, я думаю, что это то, что вы будете использовать:

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

OP не хочет фильтровать книги, которые понравился нынешнему пользователю, а скорее, чтобы получить все книги, но аннотировать те, которые понравились текущему пользователю. – solarissmoke

+0

@solarissmoke - это правильно. Я хочу ВСЕ книги и аннотировать те, которые нравятся текущему пользователю –

+0

@ 2ps, это так здорово! Спасибо! –