Python 如何在一个时间段后将Active True的布尔值更改为false

Python 如何在一个时间段后将Active True的布尔值更改为false,python,django,Python,Django,我试图在一个时间段后将布尔值的参数从True设置为false 由于我在Python和Django方面的知识有限,我正在尝试学习这个概念和逻辑,以便将其应用于项目中的其他地方 这是模型 class Coupon(models.Model): code = models.CharField(max_length=15, unique=True) valid_from = models.DateTimeField(blank=True, null=True) valid_to

我试图在一个时间段后将布尔值的参数从True设置为false

由于我在Python和Django方面的知识有限,我正在尝试学习这个概念和逻辑,以便将其应用于项目中的其他地方

这是模型

class Coupon(models.Model):
    code = models.CharField(max_length=15, unique=True)
    valid_from = models.DateTimeField(blank=True, null=True)
    valid_to = models.DateTimeField(blank=True, null=True)
    active = models.BooleanField(default=True)
当时间范围在
valid\u之后时,如何设置活动=状态变为False
这是views.py

class AddCouponView(View):
    def post(self, *args, **kwargs):
        now = timezone.now()
        form = CouponForm(self.request.POST or None)
        if form.is_valid():
            try:
                code = form.cleaned_data.get('code')
                order = Order.objects.get(
                    user=self.request.user, ordered=False)
                coupon = Coupon.objects.filter(code__iexact=code, valid_from__lte=now, valid_to__gte=now).exclude(
                    order__user=self.request.user, max_value__lte=F('used')).first()
                if not coupon:
                    messages.error(self.request, 'You can\'t use same coupon again, or coupon does not exist')
                    return redirect('core:checkout')
                else:
                    try:
                        coupon.used += 1
                        coupon.save()
                        order.coupon = coupon
                        order.save()
                        messages.success(self.request, "Successfully added coupon")
                    except:
                        messages.info(self.request, "Max level exceeded for coupon")

                    return redirect('core:checkout')

            except ObjectDoesNotExist:
                messages.info(self.request, "You do not have an active order")
                return redirect('core:checkout')

一个选项是将
更改为属性,使其处于活动状态,例如

class Coupon(models.Model):
    code = models.CharField(max_length=15, unique=True)
    valid_from = models.DateTimeField(blank=True, null=True)
    valid_to = models.DateTimeField(blank=True, null=True)

    @property
    def active(self):
        return self.valid_to >= timezone.now()

缺点是您将无法在过滤器中使用
活动
,请参阅。

我将在这里提供一些答案,从“最简单的”(也有最不利的方面,如可靠性、执行的及时性等),到可能超出您需要的更重的解决方案;只有你知道如何在给定的项目中取得平衡

一种解决方案是覆盖
save()
方法,添加逻辑检查优惠券是否过期;这可能是不够的,因为优惠券可能很少在创建后保存,并且很容易在不可接受的时间内处于错误的状态

一个更灵活的解决方案(无需添加依赖项)是编写一个管理命令来检查优惠券过期并使任何发现的过期优惠券失效,然后将其添加到系统
cron
。这仍然有一些缺点;如果cron每小时运行一次,优惠券的有效期可能比预期的长一个小时。此外,cron与您的应用程序完全分离,如果您还没有将其用于其他任务,则可能很难将检查单独的日志集等合并到您的维护/工作流程中

可靠性的下一步可能是你的goldilock解决方案:让你安排类似于
cron
的作业,但在你现有的Django应用程序中处理执行、结果跟踪、日志记录等

对于许多项目来说,最重、最繁琐、但对于任何事情来说都足够可靠和灵活的是使用。这需要芹菜,所以安装和维护的工作量要比个人项目所需的工作量大得多。但它是可伸缩的,非常灵活,等等