How to determine the range of months for any year on a Django model?

I have a Django model called Event that has a date field for the date of the event:

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

I would like to be able to set a method on a model to determine if the event is a spring semester event or a fall semester event.

The spring season will be defined as January-May. The fall is from August to December.

My goal is to be able to filter by semester in the general list of events for the year.

How will I write a method that defines each semester?

+5
source share
3 answers

One approach:

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()

Then in the view you can do:

fall_events = Event.fall_semester.all()

Hope this helps you.

+2

django Models?

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

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

, , , .

+1

You can simply use a filter on a date range using the __gt (more) and __lt (less) operators:

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

Or you can write a semester in db, you can, for example, override the save () method by default, so this is done automatically every time a new or existing event is saved. Thus, the model will look as follows:

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.

Then you can execute a simple request to Event.objects.filter (semester = 'spring')

+1
source

All Articles