Джанго: Как условно фильтровать по иностранному ключу - PullRequest
3 голосов
/ 13 мая 2019

Предположим, у меня есть несколько классов следующим образом:

from django.db import models

REVIEW_RATING_CHOICES = (
    (5, 'Five'),
    (4, 'Four'),
    (3, 'Three'),
    (2, 'Two'),
    (1, 'One'),
)

class Publication(models.Model):
    name = models.CharField()

class Article(models.Model):
    publication = models.ForeignKey(Publication)
    content = models.TextField()

class Review(models.Model):
    date = models.DateTimeField()
    article = models.ForeignKey(Article)
    rating = models.IntegerField(choices=REVIEW_RATING_CHOICES)

Предположим, что мы хотим выделить «действительно хорошие» публикации, которые мы определяем как те, в которых любой статье сразу был дан пятизвездочный обзор.

Как я могу получить количество публикаций, где любой из первых (т. Е. Самых ранних значений для Review.date) рецензий на статью давали 5 звездочек?

1 Ответ

0 голосов
/ 13 мая 2019

Полагаю, вы можете вкладывать подзапросы, но я бы беспокоился о его производительности.

from django.db.models import OuterRef, Subquery, Exists

earliest_review = Review.objects.filter(article_id=OuterRef('id')).order_by('date')
initially_approved_articles = Article.objects.annotate(
    earliest_review_status=Subquery(earliest_review.values('status')[:1]),
).filter(
    earliest_review_status=APPROVED,
    publication_id=OuterRef('id'),
)
Publication.objects.annotate(
    has_initially_approved_article=Exists(initially_approved_articles),
).filter(
    has_initially_approved_article=True,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...