Как записать пакет данных в 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

откроет интерактивную оболочку, в которой все загружено должным образом. Вы можете выполнить там свой код, и он должен сработать.

Вернуться на верх