Python 如何从预定脚本访问django模型? TL;博士:
我有一个应用程序,我想在每天午夜运行一个例程(为此,我正在使用ApsScheduler)。在这个例程的中间,它应该访问一些Django模型的数据。p> 逻辑是 Django正在运行>运行apps.py>运行调度程序.py>运行例程.py> access models.py 在文章底部提出的例外情况 -详情如下: 我的目录是:Python 如何从预定脚本访问django模型? TL;博士:,python,django,django-models,Python,Django,Django Models,我有一个应用程序,我想在每天午夜运行一个例程(为此,我正在使用ApsScheduler)。在这个例程的中间,它应该访问一些Django模型的数据。p> 逻辑是 Django正在运行>运行apps.py>运行调度程序.py>运行例程.py> access models.py 在文章底部提出的例外情况 -详情如下: 我的目录是: myproject/ - manage.py + myproject/ -- settings.py -- wsgi.py -- ... + myapp/ -+ sta
myproject/
- manage.py
+ myproject/
-- settings.py
-- wsgi.py
-- ...
+ myapp/
-+ static/
-+ templates/
-- admin.py
-- apps.py
-- models.py
-- views.py
-- scheduler.py #<<<<<<<<<<
-- routine.py #<<<<<<<<<<
-- ...
myapp/apps.py
class MyModel(models.Model):
field1 = models.DateField(auto_now=True)
field2 = models.DecimalField(max_digits=19, decimal_places=16)
...
from django.apps import AppConfig
from .scheduler import ScheduledRoutine
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
routine = ScheduledRoutine()
routine.start()
from .routine import MyRoutine
#from ..routine import MyRoutine # See error nr3 <<<<<<<<<
from apscheduler.schedulers.background import BackgroundScheduler
class ScheduledRoutine(object):
def start(self):
self.scheduler = BackgroundScheduler()
startdate = datetime.now() #For brevity assume datetime object
self.scheduler.add_job(self.routine, 'interval', days=1, start_date=startdate)
self.scheduler.start()
def routine(self):
data = MyRoutine()
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
import django
django.setup()
from .models import MyModel
#from myapp.models import MyModel # See error nr3 <<<<<<<<<
class MyRoutine(object):
def __init__(self, arg):
self.arg = arg
data = MyModel.objects.filter(reliable=True)
self.do_something(data)
myapp/scheduler.py
class MyModel(models.Model):
field1 = models.DateField(auto_now=True)
field2 = models.DecimalField(max_digits=19, decimal_places=16)
...
from django.apps import AppConfig
from .scheduler import ScheduledRoutine
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
routine = ScheduledRoutine()
routine.start()
from .routine import MyRoutine
#from ..routine import MyRoutine # See error nr3 <<<<<<<<<
from apscheduler.schedulers.background import BackgroundScheduler
class ScheduledRoutine(object):
def start(self):
self.scheduler = BackgroundScheduler()
startdate = datetime.now() #For brevity assume datetime object
self.scheduler.add_job(self.routine, 'interval', days=1, start_date=startdate)
self.scheduler.start()
def routine(self):
data = MyRoutine()
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
import django
django.setup()
from .models import MyModel
#from myapp.models import MyModel # See error nr3 <<<<<<<<<
class MyRoutine(object):
def __init__(self, arg):
self.arg = arg
data = MyModel.objects.filter(reliable=True)
self.do_something(data)
这是:
os.environ["DJANGO_SETTINGS_MODULE"] = "..myproject.settings"
两者都返回了相同的异常:
TypeError: the 'package' argument is required to perform a relative import for '.myproject.settings'
-错误Nr3:
由于上面提到的相同问题(对settings.py
的引用即myproject/settings.py
),我尝试将routine.py
移动到父文件夹,因此我需要将routine.py
和scheduler.py
中的导入更改为它们的注释版本。这导致了这一例外:
ValueError: attempted relative import beyond top-level package
-错误Nr4:
另外,运行django时注释以下行(在routine.py中)
引发django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。
wich是启动的大致过程
编辑:
-错误编号5:
在routine.py中使用此选项会引发与Nr1相同的错误
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_wsgi_application()
对我来说,问题显然是我试图访问routine.py
中的模型的方式,而不是调度程序。我还可以尝试什么?您可以尝试创建一个,这样您就可以创建一个命令,如python manage.py myroutine
,并使用调度程序(如cron)来运行它。如果您这样做,可以在代码中避免所有这些:
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
import django
django.setup()
我知道这并不能完全解决你的问题,但这是一个解决办法