我需要比较将DateTimeField中存储的年份与当前年份进行比较,并计算匹配项的数量

时间:2019-05-16 15:43:15

标签: django django-models

我有一个程序列表,其中列出了日期,该日期显示了应该对其进行审核的时间。我正在尝试计算当年应完成的程序,并在我的网页上显示该数字。 (例如,如果我的数据库中有今年要到期的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.

1 个答案:

答案 0 :(得分:0)

由于reviewDueDateTimeField,因此不能仅将2019这样的整数传递给它。 ORM应该如何得知您正在这里寻找 year ,而不是自1970年1月1日以来的秒数。

不过,您可以在此处使用__year lookup [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左右运行,那么它将在一秒钟后仍使用旧年份,直到您决定重新启动服务器为止。