如何在djang中自动更改模型字段

2024-10-04 01:35:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,我想知道是否可以设置一个触发模型字段更改的条件。例如,我有一个模型

class BillboardTracker(models.Model):
    client_name = models.CharField(max_length=400)
    entry_date = models.DateTimeField(default=datetime.now)
    duration = models.PositiveIntegerField()
    expiry_date = models.DateField()
    is_expired = models.BooleanField(default=False)

我想知道是否有可能在模型中有一个函数,当到期日到的时候,is_expired等于True。我试过了

^{pr2}$

但它不起作用。这有可能实现吗?在


Tags: name模型clientdefaultdatemodelismodels
2条回答

你需要对这个函数做两个改变, 首先使用日期时间。现在()其次

您可能需要这样更新您的逻辑:

def expire(self):
     if datetime.now() >= self.expiry_date:
        self.is_expired = True
        return True
     else:
        return False

因为有时两个值可能不完全相同,但对于所有以前的日期,BillboardTrackerneed is_expired=True。在

在你看来:

^{pr2}$

使用@属性

这里最简单的事情就是根本没有is expired字段!不需要。你需要的是房产。在

class BillboardTracker(models.Model):
    client_name = models.CharField(max_length=400)
    entry_date = models.DateTimeField(default=datetime.now)
    duration = models.PositiveIntegerField()
    expiry_date = models.DateField()

    @property
    def is_expired(self):
        if datetime.now > self.expiry_date:
            return True
        return False

请记住,数据库中没有字段,如果该字段与另一个具有简单计算的字段相同。这会自动消除你的头痛,因为你必须将项目标记为过期。在

如果你想知道一个对象是否已经过期。在

^{pr2}$

过滤

如果您想检索一组过期的对象

BillboardTracker.objects.filter(expiry_date__le=datetime.now())

这就是为什么我提到你不需要存储一个容易计算的字段。在

指数优势

在大多数RDBMS中,布尔字段(例如您的is_expired列)不能有效地索引。所以这实际上意味着,如果您在expiry\u date字段上创建索引,那么上面的查询将比对布尔字段的查询快。在

相关问题 更多 >