Run a script to populate a django db
Asked Answered
S

3

6

I want to run the following script to pre-populate a model of mine with names etc...But I get an error. The script is

first_names = first_names.split('\n')
last_names = last_names.split('\n')
phones=[str(i) for i in range(2310000000,2310999999, 1563)]
emails = ['test%[email protected]' %i for i in range(0,144)]

import os
os.environ['DJANGO_SETTINGS_MODULE']='project.settings'

from customer.models import Customer
from django.contrib.auth.models import User

users = User.objects.all()

if __name__ == "__main__":
    for i in range(10):
        customer = Customer(first_name=choice(first_names), last_name=choice(last_names),
                        telephone=choice(phones),email=choice(emails), creator=choice(users))
        customer.save()

and the error is

Traceback (most recent call last):
  File "populatedb.py", line 431, in <module>
    from customer.models import Customer
ImportError: No module named customer.models

the dir_tree is (if I can "draw" it correctly)

-project_dir
|
|--customer
|--|
   |--models.py(etc...)
|
|--project(the settings file is here)
|--
|--another_app
|--scripts (here is my python script)
Sharl answered 26/11, 2013 at 15:0 Comment(4)
Where is the script itself located?Malek
Not really something to do with the question, but there's a UNIX command line tool called tree that makes drawing directory structures a lot easier. Try doing sudo apt-get install tree if you are on linux.Proterozoic
Unfortunatelly I am on windows at work...i do have it on my Linux box at home (the tree command i mean).Sharl
Possible duplicate of Django script to access model objects without using manage.py shellSaddlebag
I
6

You may append your sys path to your script like:

import sys
sys.path.append('/path/to/your/djangoproject/')

Hope this helps.

Illusion answered 26/11, 2013 at 15:5 Comment(0)
S
4

My script worked after I added these lines before setting as os.environ var project_settings

script_path = os.path.dirname(__file__)
project_dir = os.path.abspath(os.path.join(script_path,'..','..','project_folder'))
sys.path.insert(0, project_dir)
os.environ['DJANGO_SETTINGS_MODULE']='rhombus.settings'

Thank you all!

Sharl answered 26/11, 2013 at 15:12 Comment(0)
M
4

You can also create custom django-admin commands and execute them using manage.py: https://eli.thegreenplace.net/2014/02/15/programmatically-populating-a-django-database https://docs.djangoproject.com/en/2.1/howto/custom-management-commands/

Multicolored answered 27/11, 2018 at 13:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.