Мне нужна помощь для сравнения года, хранящегося в DateTimeField, с текущим годом и подсчета числа элементов, которые соответствуют

У меня есть список процедур, в которых указана дата, когда они должны быть проверены. Я пытаюсь сосчитать процедуру, которая должна быть в текущем году, и отобразить это число на моей веб-странице. (Например, если у меня есть 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 ответ


Поскольку reviewDue является DateTimeField , вы не можете просто передать ему целое число, например 2019 . Как ORM должен знать, что вы ищете здесь год, а не количество секунд с 1 января 1970 года, например.

Однако вы можете использовать поиск __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 советует, чтобы имена моделей были единичными, поэтому вместо posts Post . Кроме того, в PEP-8 говорится, что все атрибуты должны быть в нижнем регистре с подчеркиванием в качестве разделителей слов, поэтому opm_to_review и review_due .

Примечание : более безопасно извлечь год в представлении, так как (a) здесь вы используете локальную переменную, которая не может быть установлена ​​некоторым представлением / функцией / ... с побочными эффектами; и (b) если ваш сервер работает по состоянию на 31 декабря, около 23:59:59, то он все равно будет использовать старый год спустя одну секунду, пока вы не решите перезапустить свой сервер.