Skip to main content
 首页 » 编程设计

python之获取时的 Django 模型更新

2024年10月17日34zhengyun_ustc

我的模型有一个字段,如果它在日期范围内则应该更改。

看起来像这样:

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