如何使用逻辑将模型字段值更改为时间
how to change the Model field value with logic to time
假设我有一个名为 Quote
的模型
class Quote(models.Model):
# date_validity will have persistent data like this 2023-11-30 15:00
date_validity = models.CharField(max_length=100, blank=True)
quote_status = models.CharField(
max_length=150, default='active')
所以我需要设置quote_status expired if data_validity满足当前时间,如果有效期是从现在起2天后,那么如果有效期结束,报价应该过期。
我如何自动管理它?据我所知 self.save() 方法不会自动触发。那么有什么解决这个问题的建议吗?
我想这是不可能的,除非我们像芹菜一样定期调用一个函数。还有其他方法吗?
请使用DateTimeField
[Django-doc], not a CharField
to store a timestamp. As for the status, you should not store this in the model. You can determine this when necessary, for example with a property, or with a .annotate(…)
[Django-doc]查看状态。
确实,您可以定义一个模型:
from django.utils.timezone import now
from datetime import timedelta
class Quote(models.Model):
created = models.DateTimeField()
@property
def status(self):
return 'active' if <strong>self.created >= now()-timdelta(days=2)</strong> else 'expired'
例如,您可以通过以下方式检索所有 active 和 expired 引号:
from django.db.models.functions import Now
from datetime import timedelta
active = Quote.objects.filter(<strong>created__gte=Now()-timedelta(days=2)</strong>)
expired = Quote.objects.filter(<strong>created__lt=Now()-timedelta(days=2)</strong>)
假设我有一个名为 Quote
的模型class Quote(models.Model):
# date_validity will have persistent data like this 2023-11-30 15:00
date_validity = models.CharField(max_length=100, blank=True)
quote_status = models.CharField(
max_length=150, default='active')
所以我需要设置quote_status expired if data_validity满足当前时间,如果有效期是从现在起2天后,那么如果有效期结束,报价应该过期。
我如何自动管理它?据我所知 self.save() 方法不会自动触发。那么有什么解决这个问题的建议吗?
我想这是不可能的,除非我们像芹菜一样定期调用一个函数。还有其他方法吗?
请使用DateTimeField
[Django-doc], not a CharField
to store a timestamp. As for the status, you should not store this in the model. You can determine this when necessary, for example with a property, or with a .annotate(…)
[Django-doc]查看状态。
确实,您可以定义一个模型:
from django.utils.timezone import now
from datetime import timedelta
class Quote(models.Model):
created = models.DateTimeField()
@property
def status(self):
return 'active' if <strong>self.created >= now()-timdelta(days=2)</strong> else 'expired'
例如,您可以通过以下方式检索所有 active 和 expired 引号:
from django.db.models.functions import Now
from datetime import timedelta
active = Quote.objects.filter(<strong>created__gte=Now()-timedelta(days=2)</strong>)
expired = Quote.objects.filter(<strong>created__lt=Now()-timedelta(days=2)</strong>)