如何在模型上添加到期日期函数?

时间:2019-07-19 14:01:38

标签: django django-models

我正在尝试制作一个密钥验证应用程序,该应用程序一旦被接受,便会在用户个人资料上创建相同的应用程序,因此我已完成了所有工作,但我一直在努力使到期日期部分有效,我希望当布尔值变为true时,日期已过期,但我不知道如何实施

#models.py
    class ProductKey(models.Model):
        product = models.ForeignKey(Product, on_delete=models.CASCADE, 
        unique=False)
        key = models.CharField(max_length=14)
        valid_from = models.DateTimeField(default=timezone.now)
        valid_to = models.DateTimeField()
        expired = models.BooleanField(default=False)

2 个答案:

答案 0 :(得分:0)

您可以在此用例中使用property并即时进行计算。

@property
def expired(self):
   # calculate here if its still valid

答案 1 :(得分:0)

为此添加数据库字段。您将引入数据重复:如果您稍后设置valid_to,则还必须更新expred,因此逻辑将带来额外的挑战。

您可以注释您的ProductKey模型,以便由此产生的对象具有属性expired

from django.db.models import BooleanField, ExpressionWrapper, Q
from django.db.models.functions import Now

ProductKey.objects.annotate(
    expired=ExpressionWrapper(Q(valid_to__lt=Now()), output_field=BooleanField())
)

然后可以对该属性进行过滤。例如,您可以检索已过期的ProductKey

ProductKey.objects.annotate(
    expired=ExpressionWrapper(Q(valid_to__lt=Now()), output_field=BooleanField())
).filter(expired=True)

如果经常需要,可以在管理器中对此进行注释,例如:

class ExpiredManager(models.Manager):

    def get_queryset(self):
        return super().get_queryset().annotate(
            expired=ExpressionWrapper(Q(valid_to__lt=Now()), output_field=BooleanField())
        )

class ProductKey(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, 
    unique=False)
    key = models.CharField(max_length=14)
    valid_from = models.DateTimeField(default=timezone.now)
    valid_to = models.DateTimeField()

    objects = ExpiredManager()