Я определил свою модель и все в Django, и если пользователь регистрируется через мое приложение, он хорошо регистрируется в базе данных. Проблема в том, что у меня есть файл, содержащий JSON с большим количеством пользователей. Я хочу сделать работу, которая позволит мне прочитать этот файл и вставить всех пользователей в мою базу данных.

Каков наилучший способ сделать это? Как подключиться к базе данных без использования Django?

4
mel 7 Янв 2017 в 10:16

3 ответа

Лучший ответ

Почему вы хотите подключиться к базе данных без 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
4
skoll 7 Янв 2017 в 08:25

Если вы хотите вставить данные без просмотра django, используйте оболочку

Запустите python manage.py shell в каталоге вашего приложения.

Затем импортируйте данные JSON через Python json.loads() и циклически просматривайте модели создания и сохранения данных.

Вы также можете использовать bulk_create для создания моделей.

YourCustomUserModel.objects.bulk_create([
    YourCustomUserModel(username=datarow.username)
    for datarow in data
])
1
eskawl 7 Янв 2017 в 08:41

Вместо этого вы можете использовать встроенную команду 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 для автоматического заполнения вашей базы данных.

И, конечно, вы можете расширить этот код для чтения ввода, например, из файл JSON, который вы можете хранить в папке data вашего приложения. Это позволяет вам передавать неуправляемые данные, которые должны быть частью вашего приложения, в систему управления версиями, не подвергая риску базу данных (и, следовательно, потенциально ваш доступ суперпользователя).


Кредит на это элегантное решение достается Эли Бендерскому: https: //eli.thegreenplace.net/2014/02/15/programmatically-populating-a-django-database

0
martin-martin 11 Авг 2018 в 21:40