我正在尝试制作一个密钥验证应用程序,该应用程序一旦被接受,便会在用户个人资料上创建相同的应用程序,因此我已完成了所有工作,但我一直在努力使到期日期部分有效,我希望当布尔值变为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)
答案 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()