Как запустить функцию для сравнения двух дат по месяцам?

Я пытаюсь запустить функцию для сравнения сегодняшнего месяца с месяцем, введенным пользователем. Даты будут вводиться пользователем как '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)
Вернуться на верх