我已经在Django中定义了我的模型,如果用户通过我的应用程序注册,那么用户就可以在数据库中注册。问题是我有一个包含大量用户的JSON的文件。 我想做一份工作,允许我阅读这个文件并将所有用户插入我的数据库。
最好的方法是什么?如何在不使用Django的情况下连接数据库?
答案 0 :(得分:4)
为什么不想在没有Django的情况下连接数据库?我会用Django来做,但你需要初始化Django,以便能够针对它运行脚本。这样的事情应该这样做:
import os, sys
sys.path.append('/path/to/django/project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings'
import django
django.setup()
from django.contrib.auth.models import User
for row in data:
user = User.objects.create_user(username=row['username'])
/path/to/django/project
是包含您的设置的目录所在的文件夹的路径。例如,层次结构为:
/projects/my_project
/projects/my_project/my_app
/projects/my_project/my_project/setting.py
您需要附加/projects/my_project
。
如果不是Django User
模型,则需要使用自定义模型,而不是
from django.contrib.auth.models import User
做
from app_name.models import ModelName
答案 1 :(得分:1)
如果要在不经过django视图的情况下插入数据,请使用shell
在应用目录中运行python manage.py shell
。
然后通过python的json.loads()
导入JSON数据,并循环创建和保存数据。
您还可以使用bulk_create
创建模型。
YourCustomUserModel.objects.bulk_create([
YourCustomUserModel(username=datarow.username)
for datarow in data
])
答案 2 :(得分:0)
您可以改用Django的本机manage.py
命令:
在yourapp
目录中,创建树结构(包括文件夹management
),如下所示:
yourapp
├── admin.py
├── __init__.py
├── management
│ ├── commands
│ │ ├── __init__.py
│ │ └── populate_db.py
│ └── __init__.py
├── models.py
... other files
然后,在文件populate_db.py
内编写适当的代码以填充数据库,例如:
from django.core.management.base import BaseCommand
from yourapp.models import Post, Tag
class Command(BaseCommand):
args = '<foo bar ...>'
help = 'our help string comes here'
def _create_tags(self):
tlisp = Tag(name='Python')
tlisp.save()
tjava = Tag(name='Java')
tjava.save()
def handle(self, *args, **options):
self._create_tags()
通过此设置,您可以运行$ python manage.py populate_db
以自动填充数据库。
当然,您可以扩展此代码以读取例如您可以将其保存在应用程序的data
文件夹中的JSON文件。这样一来,您就可以将应用程序中应包含的不敏感数据提交到版本控制中,而不必破坏数据库(从而可能会导致您的超级用户访问权限)。
此精美解决方案的信用归Eli Bendersky所有:https://eli.thegreenplace.net/2014/02/15/programmatically-populating-a-django-database