【问题标题】:Django: Filtering datetime field by *only* the year value?Django:仅按年份值过滤日期时间字段?
【发布时间】:2010-06-08 12:57:37
【问题描述】:

我试图吐出一个 django 页面,其中列出了所有条目的创建年份。所以,例如:

2010 年:

  • 注4

  • 注5

  • 注6

2009 年:

  • 注1

  • 注2

  • 注3

事实证明这比我预期的要困难。数据来自的模型如下:

class Note(models.Model):
    business = models.ForeignKey(Business)
    note = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = 'client_note'

    @property
    def note_year(self):
        return self.created.strftime('%Y')

    def __unicode__(self):
        return '%s' % self.note

我尝试了几种不同的方法,但似乎在每条路径上都遇到了障碍。我猜想一个有效的“分组依据”方法可以解决问题(PostGres DB 后端),但我似乎找不到任何支持它的 Django 功能。我尝试从数据库中获取单个年份,但我很难找到一种仅通过年份值过滤日期时间字段的方法。最后,我尝试添加 note_year @property,但因为它是派生的,所以我无法过滤这些值。

有什么优雅的方法可以做到这一点吗?我认为这应该很简单,但我玩得很开心。任何想法都非常感谢。

【问题讨论】:

    标签: python django django-models group-by django-queryset


    【解决方案1】:

    要么构造自定义 SQL,要么使用

    date_list = Note.objects.all().dates('created', 'year')
    
    for years in date_list:
        Note.objects.filter(created__year = years.year)
    

    这是在基于日期的通用视图中完成的方式。

    【讨论】:

    • 不敢相信这么容易;花了几个小时寻找这种功能。非常感谢。
    【解决方案2】:

    您可以使用django.views.generic.date_based.archive_year 或使用year 字段查找。

    【讨论】:

    • 链接失效
    猜你喜欢
    • 2022-08-22
    • 1970-01-01
    • 2011-07-18
    • 2015-03-06
    • 2016-12-09
    • 2021-04-14
    • 1970-01-01
    • 2014-03-12
    • 2014-03-10
    相关资源
    最近更新 更多