Django 2.0 Заполняет базу данных скриптом
Я пытаюсь заполнить свою базу данных Django скриптом, поэтому мне не нужно вводить данные вручную. Пока у меня есть следующее:
from my_app.models import ModelInApp
import django
django.setup()
def add_data(data1, data2):
d, created = ModelInApp.objects.get_or_create(data1=data1, data2=data2)
print("- Data: {0}, Created: {1}".format(str(d), str(created)))
return d
def populate():
# data is a list of lists
for row in data:
data1 = row[0]
data2 = row[1]
add_data(data1, data2)
if __name__ == "__main__":
populate()
Переменная data - это список списков, содержащих данные, которые я хочу поместить в мою базу данных. Проблема в том, что когда я запускаю скрипт, я получаю django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
ошибка. Я использую PostgreSQL в качестве базы данных.
Что я делаю неправильно?
4 ответа
Самый быстрый способ решить эту проблему - заполнить вашу БД из оболочки Django (python manage.py shell
). Ваш код без import django
а также django.setup()
должно работать нормально. Быстро и грязно;)
Надлежащий способ добавления данных - использовать миграцию данных: https://simpleisbetterthancomplex.com/tutorial/2017/09/26/how-to-create-django-data-migrations.html
Также рассмотрите возможность использования bulk_create
чтобы сделать вещи более эффективными (отфильтруйте список данных прежде, чтобы избежать дубликатов или около того)
Я знаю, что это было, как всегда, но.. Хотя технически не сценарий, Django позволяет базы данных посева пути создания арматуры
Документация очень интуитивно понятна. Я всегда использую этот метод при предварительном заполнении базы данных в Django. Например, если у вас есть модель Cars:
class Cars(models.Model):
make = models.CharField(max_length=50)
color = models.CharField(max_length=50)
Вы можете создать приспособление для посева cars.json
подобно:
[
{
"model":"myapp.cars",
"pk":1,
"fields":{
"make": "Audi",
"color":"Black"
}
},
{
"model":"myapp.cars",
"pk":2,
"fields":{
"make": "Aston Martin",
"color":"Blue"
}
}
]
Чтобы предварительно заполнить БД, просто запустите ./manage.py loaddata cars.json
Я считаю, что это лучший вариант, если вам, например, нужно загружать данные, такие как все модели автомобилей или все страны и их флаги, или что-то в одних и тех же строках для каждого создаваемого вами веб-приложения...
У меня была похожая проблема при запуске скрипта-заполнителя, т.е. исключение ядра django. Я решил проблему, добавив код
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','my_django_project.settings')
import django
django.setup()
Вот my_django_project.settings
указывает на пакет Python для вашего проекта. Если вы следуете вводному руководству При написании вашего первого приложения на Django, оно должно прочитать mysite.settings
,
Код, который вы показываете в своем примере, должен выглядеть примерно так, как показано ниже, хотя вы должны указывать имена в виде вопросительных знаков.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','???.settings')
import django
django.setup()
from ???.models import ModelInApp
def add_data(data1, data2):
d, created = ModelInApp.objects.get_or_create(data1=data1, data2=data2)
print("- Data: {0}, Created: {1}".format(str(d), str(created)))
return d
def populate():
# data is a list of lists
for row in data:
data1 = row[0]
data2 = row[1]
add_data(data1, data2)
if __name__ == "__main__":
populate()
У меня была такая же ошибка, и мое исправление заключалось в том, чтобы переместить это:
from my_app.models import ModelInApp
после
django.setup()
в основной функции
пример:
if __name__ == '__main__':
django.setup()
# import AFTER setup
from MyApp.models import ModelInApp
from django.contrib.auth.models import User