Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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 如何从预定脚本访问django模型? TL;博士:_Python_Django_Django Models - Fatal编程技术网

Python 如何从预定脚本访问django模型? TL;博士:

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

我有一个应用程序,我想在每天午夜运行一个例程(为此,我正在使用ApsScheduler)。在这个例程的中间,它应该访问一些Django模型的数据。p> 逻辑是

Django正在运行>运行apps.py>运行调度程序.py>运行例程.py> access models.py

在文章底部提出的例外情况

-详情如下: 我的目录是:

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()
我知道这并不能完全解决你的问题,但这是一个解决办法