首页 > 解决方案 > 我需要帮助将存储在 DateTimeField 中的年份与当前年份进行比较并计算匹配的项目数

问题描述

我有一份程序清单,上面有日期显示它们应被审查的时间。我正在尝试计算本年度到期的程序并在我的网页上显示该数字。(例如,如果我的数据库中有 x 个今年到期的程序。我希望对它们进行计数并将总数存储在一个变量中,我可以将其传递给我的网页并显示“程序需要今年要审核的是:x")

不确定如何从 DateTimeField 中正确提取年份并与 datetime.now().year 中的当前年份进行比较。

谢谢。

我曾尝试使用 .count,但根据我使用的变量,我会遇到各种错误。有关错误消息和我尝试过的内容的更多说明,请参阅我的代码。


views.py

        # gets current year and stores it in currentYear.
        currentYear = datetime.now().year

        # opmToReview = posts.objects.filter(reviewYear = 'currentYear').count()  
        # gives error - Cannot resolve keyword 'reviewYear' into field.

        # opmToReview = posts.objects.filter(reviewDue = 'currentYear').count()   
        # gives error - 'currentYear' value has invalid format. 

      #Tried this too but, doesn't work
      # testing for comparing dates
      def opmToReview(request):
         count = 0
         for post in posts
             if currentYear == reviewYear
             count = count + 1
       return render(request, 'opmStatistics.html', {'currentYearReview' : currentYearReview})      



models.py

         class posts(models.Model):
            OPMnumber = models.CharField(max_length = 30)
            title = models.TextField()
            contacts = models.CharField(max_length = 50)
            dateLastReviewed = models.DateTimeField()
            reviewDue = models.DateTimeField()
            status = models.CharField(max_length = 20)
            assignedTo = models.CharField(max_length = 30)
            comments = models.TextField()

            #used to extract the year from reviewDue date
            def reviewYear(self):
                return self.reviewDue.strftime('%Y')



'''



Expected results is the total number of procedure needed to be review for current year.

标签: djangodjango-models

解决方案


由于reviewDue是 a DateTimeField,因此您不能只传递这样的整数2019。ORM 应该如何知道您在此处查找年份,而不是例如自 1970 年 1 月 1 日以来的秒数。

但是,您可以在此处使用__year查找 [Django-doc]

def opmToReview(request):
    currentYear = datetime.now().year
    count = posts.objects.filter(reviewDue__year=currentYear).count()
    return render(request, 'opmStatistics.html', {'count' : count})

注意:PEP-8 建议类名以大写开头,而 Django 建议模型名是单数的,所以Post不要使用posts. 此外,PEP-8 表示属性应该全部小写,并带有下划线作为单词分隔符,所以opm_to_reviewreview_due.

 

注意:视图中提取年份更安全,因为 (a) 在这里您使用了一个局部变量,该变量不能由某些视图/函数/...设置,具有副作用;(b) 如果您的服务器在 12 月 31 日大约 23:59:59 运行,那么它仍然会在一秒钟后使用旧年份,直到您决定重新启动服务器。


推荐阅读