繁体   English   中英

如何自动更改django中的模型字段

[英]How to automatically change model fields in django

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

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。 我试过这个

def expire(self):
     if datetime.now == self.expiry_date:
        self.is_expired = True

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

使用@property

这里最简单的事情就是不要有一个过期的字段! 这不是必需的。 你需要的是一个财产。

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

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

如果要查明对象是否已过期。

 if instance.is_expired == True:
    print 'yes, that ones gone'

过滤

如果要检索已过期的整组对象

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

这就是我提到您不需要存储可以轻松计算的字段的原因。

指数优势

在大多数RDBMS中,无法有效地索引布尔字段(例如is_expired列)。 这实际上意味着如果您在expiry_date字段上创建索引,则上述查询将比该布尔字段上的查询更快。

您需要在此函数中进行两处更改,首先使用datetime.now() ,其次,

您可能希望像这样更新逻辑:

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

因为有时这两个值可能不完全相同,但对于所有以前的日期, BillboardTracker仍然需要is_expired = True。

并在你的意见:

 def your_view(request):
    instance = BillboardTracker.objects.get(id=some_id)
    if instance.is_expired() == True:
        print 'expired'
    else:
        print 'fresh'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM