Python 如何在Django模型上定义任意年份的月份范围?
我有一个名为Event的Django模型,它有一个日期字段作为事件的日期:Python 如何在Django模型上定义任意年份的月份范围?,python,django,date,methods,Python,Django,Date,Methods,我有一个名为Event的Django模型,它有一个日期字段作为事件的日期: class Event(models.Model): event_date = models.DateField() 我希望能够在模型上设置一个方法来判断事件是“春季学期”事件还是“秋季学期”事件 春季学期将定义为1月至5月。秋天是八月到十二月 我的目标是能够在一年的一般事件列表中按任意一个学期进行筛选 我如何编写定义每个学期的方法?一种方法是: class SpringSemesterEventManager
class Event(models.Model):
event_date = models.DateField()
我希望能够在模型上设置一个方法来判断事件是“春季学期”事件还是“秋季学期”事件
春季学期将定义为1月至5月。秋天是八月到十二月
我的目标是能够在一年的一般事件列表中按任意一个学期进行筛选
我如何编写定义每个学期的方法?一种方法是:
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()
希望这对您有所帮助。您看过django模型的方法吗?你可以找到他们
类事件(models.Model):
event_date=models.DateField()
def get_季节(自我):
导入日期时间
"""
返回事件的特定季节
"""
如果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(学期='spring')等等,您正在对实例的属性进行筛选(使用SQLWHERE
子句)?这是怎么回事?即使它确实有效,也会非常低效,因为它意味着对queryset的所有对象进行迭代。无论是检索一个对象还是数百个对象,确定月份是否属于特定范围都需要对每个对象进行迭代。更好的方法是在保存模型时设置一个单独的值,用于检查事件日期并确定“春/秋/无论什么”。然后可以为该字段编制索引以进行快速搜索。当我有空闲时间时,我会更新这个例子。我认为不需要单独的值。只需在管理器上更新这些方法,就可以返回一个经过如下筛选的查询集:return super(springsemesteventmanager,self)。get\u query\u set().filter(event\u date\u month\u gte=1,event\u date\u month\u lte=5)
,并从模型中删除这些属性/方法。实际上,将属性保留在模型上可能是个好主意,这样您可以查询实例,但不能在管理器中查询属性。@Mandx,后缀\uuuuuuu month\uuuu lte
在Django 1.4上对我不起作用(我得到了AttributeError)。也许这是Django的旧版本,有人能确认这是否有效吗?
Event.objects.filter(event_date__gt=datetime.date(2011, 1, 1), event_date__lt=(datetime.date(2011,6,1))
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.