Django заполнение базы данных из json файла
Подскажите, есть, ли, готовые решения для заполнения базы данных из json-файла.
Класс модели выглядит вот так
class ServiceForEnd(models.Model):
name = models.CharField(max_length=50, unique=True)
url = models.CharField(max_length=100, unique=True, primary_key=True)
methods = models.CharField(max_length=100)
id_request = models.BooleanField(default=False)
oData = models.BooleanField(default=False)
id_obligatory = models.BooleanField(default=False)
содержание json:
[
{
"name": "ReportingTrialBalance",
"url": "Reporting/TrialBalance/",
"methods": "GET",
"id_request": false,
"oData": true,
"id_obligatory": false
},
{
"name": "BankTransfer",
"url": "Bank/BankTransfer/",
"methods": "GET, POST, DELETE",
"id_request": true,
"oData": true,
"id_obligatory": false
}
]
да, можно написать комманду под manage.py
Для этого понадобится BaseCommand
Ниже пример кода для заполнения таблиц Genre и Subgenre моего проекта
Сам файл находится по пути:
├───books_website
│ ├───books
│ │ ├───management
│ │ │ ├───commands
│ │ │ │ │
│ │ │ │ │─── load_data.py
from itertools import count
from django.core.management.base import BaseCommand
import json
from books.models import Genre, SubGenre
class Command(BaseCommand):
def handle(self, *args, **options):
with open('books.json', 'rb') as f:
data = json.load(f)
for i in data:
print(i)
genre = Genre()
genre.name = i
genre.save()
g = Genre.objects.values('id').get(name = i)['id']
for j in data.get(i):
s = SubGenre()
s.name = j
s.save()
s.genres.add(g)
print('finished')
Запуск через:
python manage.py load_data
По наводке @andreymal воспользовался fixtures, специально предназначенной для загрузки начальных (initial) данных в базу. Поддерживаются форматы файлов json, YAML.
Как это провернуть:
- Переработал свой
jsonфайл к виду
[
{
"model": "app.serviceforend",
"pk": 1,
"fields": {
"name": "ReportingTrialBalance",
"url": "Reporting/TrialBalance/",
"methods": "{'GET'}",
"id_request": false,
"oData": true,
"id_obligatory": false
}
},
{
"model": "app.serviceforend",
"pk": 2,
"fields": {
"name": "BankTransfer",
"url": "Bank/BankTransfer/",
"methods": "{'GET'}",
"id_request": false,
"oData": true,
"id_obligatory": false
}
}
]
- Создал папку
fixturesв каталоге приложения и положил туда файл. Папка должна называться именно так, для автоматического поиска, но есть возможность указать просто путь к файлу. - Выполнил следующее
~/path_to_manage$ python3 manage.py loaddata a.json
- Получил ответ об успешности внесения 102 записей в таблицу.