Использование DJANGO_SETTINGS_MODULE в скрипте в подпапке - PullRequest
0 голосов
/ 19 июня 2020

Чтобы заполнить базу данных моего Django приложения, я создал небольшой скрипт, который читает CSV (список имен файлов) и соответственно создает объекты:

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
import django
django.setup()
import csv
import sys
from myapp.models import Campaign, Annotation


campaign_name = "a_great_name"
path_to_csv = "filenames.csv"

with open(path_to_csv) as f:
    reader = csv.reader(f)
    filenames = [i[0] for i in reader]

new_campaign = Campaign.objects.create(name=campaign_name)

for i in filenames:
    new_annotation = Annotation(
        campaign=new_campaign,
        asset_loc = i)
    new_annotation.save()

Я сохранил этот скрипт в root моего проекта: myrepo/populator.py, и он работал нормально.

… пока я не решил переместить его в подпапку моего проекта (это немного похоже на инструмент администратора, который следует использовать редко): myrepo/useful_tools/import_filenames/populator.py

Теперь, когда я пытаюсь запустить его, я получаю такую ​​ошибку: ModuleNotFoundError: No module named 'myproject'

Извините за вопрос о ладье ie, но мне трудно понять почему именно так происходит и как следствие как исправить. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 19 июня 2020

Да, проблема возникла, когда вы изменили расположение скрипта, потому что тогда каталог root больше не был в списке sys.path. Вам просто нужно добавить каталог root в вышеупомянутый список, чтобы иметь возможность загрузить файл settings.py вашего проекта.

Если у вас есть скрипт сейчас в myrepo/useful_tools/import_filenames/populator.py, тогда вы будете необходимо go вернуться на три папки вниз в дереве папок, чтобы вернуться в каталог root. Для этого мы можем проделать пару трюков с помощью модуля os.

import os
import sys

sys.path.append(os.path.abspath(os.path.join(__file__, *[os.pardir] * 3)))
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

import django
django.setup()

print('loaded!')
# ... all your script's logic

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