【问题标题】:How to use Django ORM to get a list by year of all articles with an article count如何使用 Django ORM 获取具有文章计数的所有文章的年份列表
【发布时间】:2011-04-27 11:51:44
【问题描述】:

我正在尝试使用 django ORM 按年份获取我所有文章的列表,旁边有文章计数,例如:

2010 年(5 篇文章)
2009 (4 篇)
2008 年(9 篇)

我已经尝试过诸如:

archive = Articles.objects.dates('created', 'year').annotate(archive_count=Count('created'))

或:

archive = Articles.objects.values('created').annotate(archive_count=Count('created'))

或:

archive = Articles.objects.values('created').aggregate(archive_count=Count('created'))

最后一个给了我正确的计数,但没有给我任何年份值,其他的给了我什么都没有或每行的 archive_count 设置为 1 的混合。

任何想法我哪里出错了?

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案1】:

    我不确定将数据库命中率降至最低是否是您的主要目标。如果是这样,可能还有另一种我没有考虑过的方式。但乍一看,这看起来像你想要的:

    archive={}
    years = Article.objects.dates('created', 'year')
    for year in years:
        archive[year.year] = Article.objects.filter(created__year=year.year).count()
    

    然后您将有一个包含 {2010: 5, 2009: 4, 2008: 9} 的字典。

    【讨论】:

    • 这样的事情可能会奏效,但我试图保持它的效率,并且有人能够通过一次数据库调用创建解决方案。
    • 是的,我不赞成@OmerGertel 的解决方案。它让我的手被打败了。我投了赞成票。 :-)
    【解决方案2】:

    在理想的世界里,你可以这样写:

    archive = Articles.objects.values('created__year').annotate(archive_count=Count('created')).order_by()
    

    以获得您想要的结果。不幸的是,django 不支持除了确切的字段名称作为 values() 的参数之外的任何内容

    archive = Articles.objects.values('created').aggregate(archive_count=Count('created'))
    

    不可能工作,因为 values('created') 为您提供了一个包含 'created' 的所有唯一值的字典,它不仅包含 'year'。

    如果您真的想通过单个 ORM 调用来执行此操作,则必须使用额外的函数并编写完全自定义的 SQL。否则贾斯汀的答案应该会很好。

    【讨论】:

    • 是的,我尝试了第一种方法,希望它会起作用,对我来说,这将是理想的方法,但正如你指出的那样,它不起作用。
    【解决方案3】:

    这是一种在一个查询中执行此操作的方法:

    Article.objects.extra(select={'year':"strftime('%%Y',created)"}).values('year').order_by().annotate(Count('id'))
    

    请注意,您必须根据您的数据库替换 strftime('%%Y',created)(我使用的是 sqlite)。

    【讨论】:

    • 谢谢!效果很好,我现在也在使用 sqlite 进行开发,所以它可以立即工作。
    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2023-04-05
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多