我的django项目称为mybooks,而该应用程序就是清单。我正在编写一个名为searchBooks.py的python脚本,该脚本需要Listings应用程序中的某些模型。 searchBooks.py脚本位于列表文件夹中(与models.py相同),但是,我无法访问模型。
我做了一些其他用户建议的here,包括
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mybooks.settings")
from listings.models import books
但是,我收到ModuleNotFoundError:没有名为“列表”的模块
我应该在settings.py中进行任何更改吗?还是searchBooks.py的目录?
答案 0 :(得分:1)
您需要编写一个在manage.py
中调用的,在Django上下文中运行的脚本。很简单。
在您的应用中,首先创建app/management/commands/__init__.py
(空文件,您可能需要创建文件夹)。然后,首先将此模板复制到app/management/commands/noop.py
:
# invoke with ./manage.py noop [--total] 1 2 3 ...
# script in app/management/noop.py with __init__.py
from django.core.management.base import BaseCommand
class Command( BaseCommand):
def add_arguments( self, parser): # parser is Python argparse parser
parser.add_argument( 'number_list', nargs='+', type=int,
help='any number of integers to add up',
)
parser.add_argument( '--total', action='store_true', default=False,
help='Print the total as well as the args'
)
parser.add_argument( '--file', type=self.infile)
def handle( self, *args, **options ):
# print( f'Args: {args}' ) # what are args?
if options['verbosity'] >= 2: # inherit default options, including verbosity and help.
# use --help to explore the others
print( f'Options: {options}' )
if options['total']:
total = sum( options['number_list'])
print( f'Total: {total}' )
if options['file']:
print('First line is:')
print( options['file'].readline() )
def infile( self, arg):
return open( arg, 'r')
如果您不熟悉argparse,请查阅其文档资料(它是标准的Python,而不是Django):https://docs.python.org/3/library/argparse.html
一旦确定它可以工作,您就可以得到六个
./manage.py noop --total 1 2 3
将其复制到同一文件夹中的其他名称作为起点,并对其进行修改以执行希望从命令行执行的任何操作。您将首先添加
from listings.models import Whatever, ...
,然后按照定义的任何选项的指示,修改handle方法以对它们执行任何操作。
Django文档:https://docs.djangoproject.com/en/2.1/howto/custom-management-commands/