Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django模型上定义任意年份的月份范围?_Python_Django_Date_Methods - Fatal编程技术网

Python 如何在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

我有一个名为Event的Django模型,它有一个日期字段作为事件的日期:

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

等等,您正在对实例的属性进行筛选(使用SQL
WHERE
子句)?这是怎么回事?即使它确实有效,也会非常低效,因为它意味着对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.