【问题标题】:How can i check the model object is 30 days old or not in Django?如何在 Django 中检查模型对象是否存在 30 天?
【发布时间】:2021-08-01 06:39:19
【问题描述】:

信息:我正在尝试制作按月计费的应用程序。客户可以按月付款购买房产的地方。如果客户上次付款 30 天前,我想将 pending 属性 True 更改为 False。

这是一个基于日程安排的应用程序,但我没有使用 django-crontabcelrey。如果用户访问pending_customers 页面,我可以使用视图功能,如果created_at 日期时间为 30 天,视图可以检查所有客户以及最后付款日期created_at。那么view函数可以将pending改为False。

pending_customers view 工作正常,但是当我访问页面 pending_customers 时,它会将 pending 更改为 False。它不能等待30天。如果客户最后一次付款不是 30 天,那么我如何才能将 view 功能保留到 30 天?

models.py

class Customer(models.Model):
    """Customer Model"""

    name = models.CharField(max_length=255)
    prop_select = models.ForeignKey(Property, on_delete=models.SET_NULL, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    pending = models.BooleanField(default=False)

class Payment(models.Model):
    """Payment Model"""

    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL, related_name='payment')
    created_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(max_digits=17, decimal_places=2, default=0.0)

    def save(self, *args, **kwargs):
        super(Payment, self).save(*args, **kwargs)
        self.customer.pending = True
        self.customer.save()

views.py

def pending_customers(request):

    queryset = Customer.objects.all()

    for i in queryset:
        for d in i.payment.filter(created_at__gte=datetime.now() - timedelta(minutes=30)).order_by('-pk')[:1]:
            d.customer.pending = False
            d.customer.save()

    context = {
        'customers': queryset,
    }
    return render(request, 'customer/pending-customers.html', context)

【问题讨论】:

    标签: python django django-models django-views django-cron


    【解决方案1】:

    我认为您使用错误的条件将pending_customer 标记为False。 现在你正在做相反的事情(标记那些小于或等于 30)

    据我所知,你想做什么created_at__gte=datetime.now() - timedelta(days=30))

    即“将所有 30 天或更长时间的付款给我”

    【讨论】:

    • 我的问题已更新,我也尝试使用created_at__gte=datetime.now() - timedelta(days=30)),但它不起作用...
    • 你能详细说明“不工作”吗?发生了什么,您期待什么以及实际的反应是什么?
    • 亲爱的,如果客户最后一次付款是 30 天,那么我想检查客户的最后一次付款,然后 pending False 否则为真...但是我的代码和您的代码工作相同。它不检查最后的付款对象日期,它只是更新pending false
    • 查看Payment类的save函数,没有pending_customer字段。 pending 字段可能默认设置为 False
    • 是的,pending 在创建新支付对象时自动为 True。如果这笔付款是 30 天前,那么客户会进入 pending False 这是我想要做的逻辑......
    猜你喜欢
    • 2017-05-13
    • 2022-10-16
    • 2021-10-05
    • 2019-09-01
    • 2023-03-22
    • 2017-02-09
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多