将自定义函数放在Django中的哪里?

时间:2020-08-29 13:02:02

标签: python django django-models django-views

在我的models.py中,我有这个课程。

import time

class Ticket(models.Model):
    username = models.CharField(max_length=50)
    booking_time = time.time()
    expired = models.BooleanField(default=False)

如果自booking_time起已经过了1个小时,我希望过期的布尔值变为true,但是我不知道应该在哪里检查同一件事(我当时想在views.py,但只有当我们转到某个URL时才会调用视图,就我而言,我想每小时检查一次。

2 个答案:

答案 0 :(得分:2)

如果您希望在Django的后台运行类似脚本的内容,则可以在应用程序文件夹中创建例如script.py。在该代码中,您甚至可以拥有

def main()
    while True:
       ....

然后,您必须转到wsgi.py(在项目文件夹中)并导入脚本。 就像

import os
import threading

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'weather_raspi.settings')


t = threading.Thread(target=main, args=(args)) #here will you give the function as task and arguments into args
t.start() #this line starts the function
application = get_wsgi_application()

这应该可以正常工作 希望你这次能得到它

答案 1 :(得分:1)

另一种解决方案是将模型更改为使用expiration_time而不是过期的布尔值,然后可以定义一个检查expiration_time与now()的函数

class Ticket(models.Model):
    ...
    expiration_time = models.DateTimeField()

    def expired(self):
        return self.expiration_time > datetime.now()

或作为查询:

expired_tickets = Ticket.objects.filter(expiration_time__gt=Now())

https://docs.djangoproject.com/en/3.1/ref/models/database-functions/#now