Передача данных в sql
from django.shortcuts import render
import json
from .models import MyModel
import os
def display(request):
json_file_path = os.path.join(os.path.dirname(__file__), '..', '..', './jsondata.json')
try:
with open(json_file_path, 'r') as f:
data = json.load(f)
for item in data:
my_model_instance = MyModel(end_year=item['end_year'], intensity=item['intensity'],
sector=item['sector'], topic=item['topic'], insight=item['insight'],
url=item['url'], region=item['region'], start_year=item['start_year'],
impact=item['impact'], added=item['added'], published=item['published'],
country=item['country'], relevance=item['relevance'], pestle=item['pestle'],
source=item['source'], title=item['title'], likelihood=item['likelihood'])
my_model_instance.save()
except FileNotFoundError:
data = []
template_name = 'display'
return render(request, template_name, {'data': data})
я пытаюсь передать данные из json в sql с помощью django
Вы сохраняете элемент вне цикла for
, поэтому сохраняется только последняя строка, так как в конце цикла my_model_instance
будет указывать на последний созданный элемент.
Мы можем составить список элементов и использовать .bulk_create(…)
[Django-doc] для добавления всех элементов в базу данных в одном запросе:
from django.shortcuts import render
import json
from .models import MyModel
import os
def display(request):
json_file_path = os.path.join(
os.path.dirname(__file__), '..', '..', './jsondata.json'
)
with open(json_file_path, 'r') as f:
data = json.load(f)
my_models = [
MyModel(
end_year=item['end_year'],
intensity=item['intensity'],
sector=item['sector'],
topic=item['topic'],
insight=item['insight'],
url=item['url'],
region=item['region'],
start_year=item['start_year'],
impact=item['impact'],
added=item['added'],
published=item['published'],
country=item['country'],
relevance=item['relevance'],
pestle=item['pestle'],
source=item['source'],
title=item['title'],
likelihood=item['likelihood'],
)
for item in data
]
MyModel.objects.bulk_create(my_models)
template_name = 'display'
return render(request, template_name, {'data': data})