Как записать пакет данных в sqlite db Django из пользовательского файла?
Для проекта, над которым я работаю, мне нужно импортировать список людей в sqlite db. У меня есть модель 'Staff', а также файл users.csv со списком пользователей. Вот как я это делаю:
import csv
from staff.models import Staff
with open('users.csv') as csv_file:
csv_reader = csv.DictReader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
firstname = row['firstname']
lastname = row['lastname']
email = row['email']
staff = Staff(firstname=firstname, lastname=lastname, email=email)
staff.save()
csv_file.close()
Однако, я получаю следующее сообщение об ошибке:
raise ImproperlyConfigured( django.core.exceptions.ImproperlyConfigured: Запрошена настройка INSTALLED_APPS, но настройки не настроены. Вы должны либо определить переменную окружения DJANGO_SETTINGS_MODULE, либо вызвать settings.configure() перед обращением к настройкам.
Правильно ли то, что я делаю? Если да, то что я упускаю?
Django нужны некоторые переменные окружения, когда он загружается для запуска. DJANGO_SETTINGS_MODULE
является одной из них, которая затем используется для настройки Django из параметров. Как правило, многие разработчики даже не замечают этого, потому что если вы остаетесь в стране Django-land, это не имеет большого значения. Взгляните на manage.py
и вы заметите, что он устанавливает его в этом файле.
Самое простое - оставаться в стране django- и запускать свой скрипт в его фреймворке. Я рекомендую создать команду управления. Возможно, более правильный способ - создать миграцию данных и поместить данные в хранилище типа S3, если это нужно многим людям для локальных баз данных... но похоже, что команда управления - это то, что вам нужно. Другой вариант (и самый простой, если это действительно только одноразовая вещь) - просто запустить это из оболочки django. Я помещу это в самом низу.
Это очень просто, и вы можете вставлять свой код почти в том виде, в котором он у вас есть. Вот документация :) https://docs.djangoproject.com/en/3.2/howto/custom-management-commands/
Для вас это может выглядеть примерно так:
/app/management/commands/load_people.py
<-- имя файла здесь - это то, что manage.py
будет использоваться для выполнения команды позже.
from django.core.management.base import BaseCommand, CommandError
import csv
from staff.models import Staff
class Command(BaseCommand):
help = 'load people from csv'
def handle(self, *args, **options):
with open('users.csv') as csv_file:
csv_reader = csv.DictReader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
firstname = row['firstname']
lastname = row['lastname']
email = row['email']
staff = Staff(firstname=firstname, lastname=lastname, email=email)
staff.save()
# csv_file.close() # you don't need this since you used `with`
, который можно вызвать следующим образом:
python manage.py load_people
Наконец, самое простое решение - просто запустить код в оболочке Django.
python manage.py shell
откроет интерактивную оболочку, в которой все загружено должным образом. Вы можете выполнить там свой код, и он должен сработать.