[Fixed]-Django 2.0 Populating Database with a Script

12πŸ‘

βœ…

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 πŸ˜‰

In case you need to add data from time to time, consider writing a management command. This will allow you to call python manage.py my_command_name datafile.dat. You can implement whatever logic inside the command (data from file or API, create or update).

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

πŸ‘€nad_rom

18πŸ‘

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 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 the car models or all countries and their flags in the same lines for every web app you create…

πŸ‘€karuoro

7πŸ‘

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()
πŸ‘€John

0πŸ‘

I had the same error my fix was to move this:

from my_app.models import ModelInApp

after the

django.setup()

in the main function

example:

if __name__ == '__main__':
    django.setup()
    # import AFTER setup
    from MyApp.models import ModelInApp
    from django.contrib.auth.models import User
πŸ‘€KillerKingTR

Leave a comment