Скрипт Django для доступа к объектам модели - PullRequest
0 голосов
/ 21 марта 2019

Мой проект django называется mybooks, а приложение - списками. Я пишу скрипт на языке python с именем searchBooks.py, которому нужны некоторые модели в приложении листингов. Сценарий searchBooks.py находится в папке списков (так же, как models.py). Однако я не могу получить доступ к моделям.

Я сделал то, что некоторые другие пользователи предлагают здесь , включая

import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mybooks.settings") from listings.models import books

Тем не менее, я получаю ModuleNotFoundError: нет модуля с именем «списки»

Должен ли я что-то менять в файле settings.py? Или, может быть, каталог searchBooks.py?

1 Ответ

1 голос
/ 21 марта 2019

Вам нужно написать скрипт, который запускается в контексте Django, вызывается через manage.py. Это довольно просто.

В вашем приложении сначала создайте 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 doc: https://docs.djangoproject.com/en/2.1/howto/custom-management-commands/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...