#python #json #django
#python #json #django
Вопрос:
У меня есть этот код, но в моем файле JSON есть несколько строк с пустыми строками. И я получаю эту ошибку. Это пользовательская команда, и я получаю эту ошибку. Я хочу создать список заданий в базе данных моего приложения Django, я использую цикл For. Большое спасибо за вашу помощь
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 2)
from django.core.management.base import BaseCommand
from jobs.models import Job
import json
class Command(BaseCommand):
help = 'Set up the database'
def handle(self, *args: str, **options: str):
with open('static/joblist03112020.json', 'r') as handle:
for line in handle.readlines():
print(line)
line = json.loads(line)
existing_job = Job.objects.filter(
job_title = line['job_title'],
company = line['company'],
company_url = line['company_url'],
description = line['description'],
salary = line['salary'],
city = line['city'],
district = line['district'],
url = line['url'],
job_type = line['job_type'],
)
if existing_job.exists() is False:
Job.objects.create(
job_title = line['job_title'],
company = line['company'],
company_url = line['company_url'],
description = line['description'],
salary = line['salary'],
city = line['city'],
district = line['district'],
url = line['url'],
job_type = line['job_type'],
)
Job.save()
self.stdout.write(self.style.SUCCES('added jobs!add'))
Ответ №1:
Вероятно, вы захотите загрузить весь файл JSON вместо загрузки построчно. Не каждая строка в файле JSON гарантированно анализируется сама по себе как допустимый объект JSON.
Вот дух того, что, я думаю, вы хотите сделать:
with open('static/joblist03112020.json') as f:
job_list = json.load(f)
Обратите внимание, что по умолчанию используется открытие с 'r'
помощью for read , поэтому я удалил его.
Теперь вы можете перебирать каждое задание в списке и применять фильтр. Если ключи вашего объекта JSON соответствуют столбцам вашей модели, вы также можете упростить этот код:
for job in job_list:
existing_job = Job.objects.filter(**job)
if not existing_job.exists():
Job.objects.create(**job)
Обратите внимание, что вам не нужно будет вызывать .save()
, поскольку create
включает сохранение. Кроме того, .save()
метод в любом случае определяется только для экземпляра класса.
Комментарии:
1. `Команда класса (BaseCommand): help = ‘Настройка базы данных’ дескриптор def(self, * аргументы: str, ** параметры: str): с открытым (‘static/joblist03112020.json’) как f: job_list = json.load(f) для задания в job_list: existing_job= Job.objects.filter( ` вот так?
2. что означает соответствие моей модели? те же поля? и тот же порядок полей?
3. Если поля совпадают, вы можете использовать операцию распаковки словаря (
**
) для передачи аргументов командамfilter
andcreate
.
Ответ №2:
кто-то из этой платформы помогает мне с моей проблемой. это то, что я сделал. и решите проблему. Мне нужно было работать с большим JSON
def handle(self, *args: str, **options: str):
with open('static/data.json', 'r') as handle:
big_json = json.loads(handle.read())
for item in big_json:
existing_job = Job.objects.filter(