Django 2.0 Populating Database with a Script

空扰寡人 提交于 2020-03-03 19:16:08

问题


I'm trying to populate my Django database with a script so I don't have to enter in the data manually. So far I have the following:

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()

The data variable is a list of lists containing the data I want to put into my database. The problem is, when I run the script, I get a django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. error. I am using PostgreSQL as the database.

What am I doing wrong?


回答1:


The fast way to work it out is to populate your DB from Django shell (python manage.py shell). Your code without import django and django.setup() should work fine. Fast & dirty ;)

The super-proper way to add data is to use data migration: https://simpleisbetterthancomplex.com/tutorial/2017/09/26/how-to-create-django-data-migrations.html

Also, consider using bulk_create to make things more efficient (filter the data list before to avoid duplicates or so)




回答2:


I had a similar problem when running a population script, i.e. django core exception. I solved the problem by adding the code

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','my_django_project.settings')

import django
django.setup()

Here my_django_project.settings points to the Python package for your project. If you are following the introductory tutorial Writing your first Django app, it should read mysite.settings.

The code you show in your example, should read something like shown below, although you have to specify names as indicated by question marks.

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()



回答3:


I know it's been like forever but.. Although not technically a script, Django allows database seeding by creating a fixture

The documentation is very much intuitive. This is always my go-to method when pre-populating a database in Django. For example, if you have a model Cars:

class Cars(models.Model):
    make = models.CharField(max_length=50)
    color = models.CharField(max_length=50)

You can create a seeding fixture cars.json like:

[
  {
    "model":"myapp.cars",
    "pk":1,
    "fields":{
      "make": "Audi",
      "color":"Black"
    }
  },
  {
    "model":"myapp.cars",
    "pk":2,
    "fields":{
      "make": "Aston Martin",
      "color":"Blue"
    }
  }
]

To prepopulate the DB, just run ./manage.py loaddata cars.json

I find this is the best option if you for example have to load data like all car models or all countries and their flags or sth in the same lines for every web app you create...



来源:https://stackoverflow.com/questions/51227687/django-2-0-populating-database-with-a-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!