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
Другие вопросы по тегам