如何在Django模型中定义任意年份的月份范围?
我有一个叫做 Event 的 Django 模型,这个模型里有一个日期字段,用来记录事件的日期:
class Event(models.Model):
event_date = models.DateField()
我想在这个模型上设置一个方法,来判断这个事件是属于“春季学期”还是“秋季学期”。
春季学期的定义是从一月到五月,而秋季学期是从八月到十二月。
我的目标是能够在一整年的事件列表中,根据学期来筛选事件。
我该如何编写这个方法来定义每个学期呢?
3 个回答
1
你有没有看看Django的模型方法?你可以在这里找到相关信息。
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"
显然,上面的代码是错误的,不过你知道该怎么做。
1
你可以简单地使用过滤器来选择一个日期范围,使用 __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')
2
一种方法是:
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()
希望这对你有帮助。