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

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

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

Однако вы можете использовать __year lookup [Django-doc] здесь:

def opmToReview(request):
    currentYear = datetime.now().year
    count = posts.objects.filter(reviewDue<b>__year=currentYear</b>).count()
    return render(request, 'opmStatistics.html', {'count' : count})

Примечание : PEP-8 рекомендует, чтобы имена классов начинались св верхнем регистре, а Django советует, чтобы названия моделей были единичными, поэтому Post вместо posts.Кроме того, в PEP-8 сказано, что все атрибуты должны быть строчными и подчеркивания в качестве разделителей слов, поэтому opm_to_review и review_due.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...