如何使用Max()

时间:2018-01-14 18:32:17

标签: python django orm django-annotate

我有一个模型存储不同杂志(出版物)的封面图像。

在简化版本中,它看起来像这样

class Publication(models.Model):
    name = models.CharField(max_length=100)
    website = models.CharField(max_length=100)

class PublicationIssue(models.Model):
    publication = models.ForeignKey(Publication, null=False)
    issue_number = models.IntegerField(null=False)
    cover_image = models.CharField(max_length=100)

在SQL中,我可以执行以下操作:

select 
publication_id, 
max(issue_number) current_issue, 
cover_image 
from conditionalsum_publicationissue 
group by publication_id

这会查找出版物的最大发行号,并轻松地向我提供当前的发行号和相关的封面图像。输出看起来像这样:

publication_id   current_issue   cover_image
1                12              ae43fb33.jpg
2                26              445fbb45.jpg
3                213             db8489e3.jpg

我知道我可以在Django查询中使用rawsql,但我想知道是否有解决方案可以避免这种情况。

很容易得到当前的问题:

PublicationIssue.objects. \
values('publication_id'). \
annotate(current_issue=Max('issue_number'))

这将使用current_issue返回publication_id。但就添加cover_image而言,这看起来像死路一条。

添加' cover_image'到values子句不起作用,任何进一步的注释将同样以不正确的方式扩展查询集。我试图使用子查询,但对于相对简单的SQL语句来说,这会变得相当长且复杂。

总结:我的问题是如何翻译

select 
publication_id, 
max(issue_number) current_issue, 
cover_image 
from conditionalsum_publicationissue 
group by publication_id

- 挑战是cover_image字段 - 在不使用rawsql的情况下进入Django查询?

0 个答案:

没有答案