Как запустить функцию для сравнения двух дат по месяцам?
Я пытаюсь запустить функцию для сравнения сегодняшнего месяца с месяцем, введенным пользователем. Даты будут вводиться пользователем как 'YYYY-MM-DD'. Вот что у меня есть на данный момент:
class Sneaker(models.Model):
name = models.CharField(max_length=100)
brand = models.CharField(max_length=100)
description = models.TextField(max_length=250)
date = models.DateField('release date')
price = models.IntegerField()
def worn_for_the_month(self):
return self.worn_set.filter(date=date.today().month).count == date.month
Но получаем следующую ошибку:
fromisoformat: аргумент должен быть str
Поэтому я попробовал использовать следующую функцию вместо строки:
def worn_for_the_month(self):
return self.worn_set.filter(date=str(date.month)) == str(date.month)
И я получаю эту ошибку:
%(value)s" значение имеет неверный формат даты. Она должна быть в формате YYYY-MM-DD.
.
Я не уверен, что использую правильный тип функции в данный момент. Я просто хочу сравнить месяц, в котором мы находимся, с тем, который ввел пользователь.
Во-первых, я думаю, что вам нужно отступить от всех элементов, которые находятся после класса sneaker, чтобы поместить эти элементы внутрь класса. И затем вы забыли импортировать модели. 'from django.db import models' после "pip install django" будет работать. В случае, если на django.utils написано ModuleNotFoundError, вы можете захотеть pip install django.utils тоже.
Если вы действительно хотите отфильтровать только по значению месяца, вы можете сделать что-то вроде этого (__month
):
def worn_for_the_month(self):
return self.worn_set.filter(date__month=date.today().month).count()
Однако я полагаю, что вы не хотите этого делать, потому что вы будете считать те, которые были надеты в июле 2022 года, а также в июле 2021, 2020 и так далее... Вместо этого вы можете использовать replace()
или timedelta
из библиотеки datetime:
from datetime import datetime
""" replace the days to get the first of the month: """
today = datetime.now()
first_of_the_month = today.replace(day=1)
# output: datetime.datetime(2022, 7, 1, 19, 54, 45, 95533)
""" use timedelta to get 31 days ago: """
one_month_ago = today - timedelta(days=31)
# output: datetime.datetime(2022, 6, 18, 19, 56, 15, 39065)