我的模型有一个字段,如果它在日期范围内则应该更改。
看起来像这样:
class Election(models.Model)
start_date = models.DateTimeField(verbose_name = 'Start Date')
end_date = models.DateTimeField(verbose_name = 'End date')
active = models.BooleanField(default=False)
def updateActive(self):
now = timezone.now()
if self.start_date < now and self.end_date > now:
self.active=True
else:
self.active=False
self.save()
现在,每次我查询这个模型时,我都会从我的 views.py 调用 updateActive()。
所以,我的问题是:有没有办法在我每次获取 Election 对象时调用 updateActive()?还是保持不断更新?
欢迎任何想法。
请您参考如下方法:
最好的方法是在您的模型中根本不要有 active 字段。主要原因是当一个值可以通过简单的计算生成时,它不应该存储在数据库中。第二个原因是 BooleanField 不能被有效索引,涉及这个字段的查询会很慢。因此,通过计算而不是进行字段,您不会损失任何东西。最好的方法是像这样添加自定义查询集:
class ElectionQuerySet(models.QuerySet):
def is_active(self):
return self.filter(start_date__lt=timezone.now()).filter(end_date__gt=timezone.now())
现在你的模型真的很简单。
类选举(模型。模型): start_date = models.DateTimeField(verbose_name = '开始日期') end_date = models.DateTimeField(verbose_name = '结束日期')
objects = ElectionQuerySet.as_manager()
现在您的模型非常简单。
class Election(models.Model):
start_date = models.DateTimeField(verbose_name = 'Start Date')
end_date = models.DateTimeField(verbose_name = 'End date')
objects = ElectionQuerySet.as_manager()
是的,就是这样。每次获取对象时都不需要更新数据库!您可以使用一种简单的方法来找出什么是活跃的或不活跃的
Election.objects.is_active()
is_active 的结果是一个查询集,您可以照常链接它
Election.objects.is_active().filter(...)
如果你想检查模板中的选举是否有效,你可以这样做:
class Election(models.Model):
def is_active()
if self.start_date < now and self.end_date > now:
return True
