Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将datefield与today进行比较,并每天自动更改integerfield_Python_Django - Fatal编程技术网

Python 将datefield与today进行比较,并每天自动更改integerfield

Python 将datefield与today进行比较,并每天自动更改integerfield,python,django,Python,Django,我正在用django做一个网站 class Member(models.Model): ... end_date = models.DateField(blank=True, default=(datetime.now() + timedelta(days=30))) Membership_status = models.IntegerField(blank=True, null=True, default=1) # 1 = active, 0=deactiv

我正在用django做一个网站

class Member(models.Model):
      ...
      end_date = models.DateField(blank=True, default=(datetime.now() + timedelta(days=30)))
      Membership_status = models.IntegerField(blank=True, null=True, default=1) # 1 = active, 0=deactivate, 2=refund
我要做的是将end_date字段与today.date every 1.a.m.进行比较。如果今天<结束日期,会员资格状态字段将自动更改为0

我听说我应该用django-kronos()。 但是我不明白使用方法

有没有人可以告诉我如何实现我想要的细节


任何帮助都会对我很有帮助,谢谢

首先,这不是对你最初的疑问的回答,只是对你未来的建议

不要将函数调用传递到字段默认值中。如果您这样做了,该函数将在迁移时进行评估。如果查看迁移文件,您可以肯定地看到。而是将其包装在函数中,并将其作为可调用函数传递

例如:

现在,在你们的模型中

class Member(models.Model):
    ...
    end_date = models.DateField(blank=True, default=NEXT_MONTH_DAY)
这样,每当创建
成员
的实例时,就会调用函数
NEXT\u MONTH\u DAY

编辑

对于您最初的查询,我还没有测试代码,但我想您可能正在寻找类似的东西

import kronos

@kronos.register('0 1 * * *')
def the_task():
    for member in Member.objects.all():
        if TODAY() == member.end_date:
            member.Membership_status = 0
            member.save()

你真的需要有一个会员身份字段吗?您将复制信息,这往往会导致不一致。相反,您可以在想知道状态是否已过期时检查
end\u date
是否在过去(为此,我建议将
db\u index=True
添加到
end\u date
,这样您就可以一次有效地查询所有成员的状态)@JohnCarter谢谢你的评论,但是“db_index=True”是什么意思?我想检查会员的状态(有效、过期、退款)。如果您还想跟踪退款,可以使用日期时间退款列(默认值为无)否,这将导致不必要的更改。Member.objects.filter(end_date_uuulte=TODAY()).update(membership_status=0‌​)<代码>\uu lte相当于“小于或等于”,因此,此查询也将是错误和低效的。感谢您的回答。kronos方法是如何在每个午夜自动实现的??(我刚刚安装了kronos,并在已安装的应用程序中编写了“kronos”,我制作了cron.py)恐怕我对cron jobs的工作一无所知。您可能需要查看他们的文档或类似教程。我碰巧偶然发现了一个示例并编写了此代码,只是为了给您一个想法。
import kronos

@kronos.register('0 1 * * *')
def the_task():
    for member in Member.objects.all():
        if TODAY() == member.end_date:
            member.Membership_status = 0
            member.save()