首页 > 解决方案 > 如何在一段时间后将 Active True 的布尔值更改为 false

问题描述

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

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

这是 Models.py

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)

当时间范围在 Active=status 变为 False 之后如何设置valid_to这里是 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')

标签: pythondjango

解决方案


一种选择是active通过将其更改为属性来使其动态化,例如

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()

缺点是您将无法active在过滤器中使用,请参阅按属性过滤


推荐阅读