Как определить диапазон месяцев для любого года на модели Django? - PullRequest
5 голосов
/ 11 октября 2011

У меня есть модель Django под названием Event, в которой есть поле даты для даты события:

class Event(models.Model):
    event_date = models.DateField()

Я хотел бы иметь возможность установить метод для модели, чтобы определить, является ли событиеявляется событием "весенний семестр" или "осенний семестр".

Весенний семестр будет определяться с января по май.Осень с августа по декабрь.

Моя цель - иметь возможность фильтровать по любому семестру в общем списке событий за год.

Как мне написать метод определения каждого семестра?

Ответы [ 3 ]

2 голосов
/ 11 октября 2011

Один из подходов:

class SpringSemesterEventManager(models.Manager):
    def get_query_set(self):
        return super(SpringSemesterEventManager, self).get_query_set() \
            .filter(is_spring_semester=True)

class FallSemesterEventManager(models.Manager):
    def get_query_set(self):
        return super(FallSemesterEventManager, self).get_query_set() \
            .filter(is_fall_semester=True)

class Event(models.Model):
    event_date = models.DateField()

    @property
    def is_spring_semester(self):
        month = self.event_date.month
        return True if month >= 1 and month <= 5 else False

    @property
    def is_fall_semester(self):
        month = self.event_date.month
        return True if month >= 8 and month <= 12 else False

    objects = models.Manager()
    spring_semester = SpringSemesterEventManager()
    fall_semester = FallSemesterEventManager()

Тогда в представлении вы можете сделать:

fall_events = Event.fall_semester.all()

Надеюсь, это поможет вам.

1 голос
/ 11 октября 2011

Вы можете просто использовать фильтр для диапазона дат, используя операторы __gt (больше чем) и __lt (меньше чем):

Event.objects.filter(event_date__gt=datetime.date(2011, 1, 1), event_date__lt=(datetime.date(2011,6,1))

Или вы можете записать семестр в БД, например, вы можетепереопределите метод save () по умолчанию, чтобы он выполнялся автоматически при каждом сохранении нового или существующего события.Таким образом, модель будет выглядеть следующим образом:

class Event(models.Model):
    event_date = models.DateField()
    semester = models.CharField(max_length=10)

def save(self, *args, **kwargs):
    # determine if the even is in the spring or fall
    if self.event_date.month in [1,2,3,4,5]
        self.semester = 'spring'
    elif self.event_date.month in [8,9,10,11,12]
        self.semester = 'fall'
    super(Event, self).save(*args, **kwargs) # Call the "real" save() method.

Тогда вы можете просто запросить Event.objects.filter (semester = 'spring')

1 голос
/ 11 октября 2011

Вы смотрели на методы моделей Джанго?Вы можете найти их здесь

class Event(models.Model):
    event_date = models.DateField()

    def get_season(self):
        import datetime
        """
        Returns the event's specific season
        """
        if 1 <= datetime.date.today().month < 4:
            return "Winter event"

Очевидно, что приведенный выше код неверен, но вы знаете, что делать.

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