【问题标题】:Django: How to conditionally filter on foreignkeyDjango:如何有条件地过滤外键
【发布时间】:2019-09-30 18:40:50
【问题描述】:

假设我有一些类如下:

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 颗星的出版物计数? p>

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    我相信你可以嵌套子查询,但我会担心它的性能。

    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,
    )
    

    【讨论】:

    • 为清楚起见,我更新了将“status”替换为“rating”的问题。
    • 我提供的应该仍然有效。只需调整与评分的状态比较即可。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2020-09-07
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2013-09-05
    • 2016-07-12
    相关资源
    最近更新 更多