Импорт файла JSON в модель Django - PullRequest
11 голосов
/ 10 марта 2012

У меня есть файл в формате json, с такой структурой:

{
    "Admiralty Islands": [
        [
            "Up to 1 kg",
            "5.00"
        ], 
        [
            "1 - 10 kg", 
            "10.00"
        ], 
    ], 
    "Afghanistan": [
        [
            "Up to 1 kg",
            "15.00"
        ], 
        [
            "1 - 10 kg", 
            "20.00"
        ], 
    ], 
...
}

И три модели:

class Country(models.Model):
    name = models.CharField(max_length=128, unique=True)

class Weight(models.Model):
    name = models.CharField(max_length=128, unique=True)
    min_weight = models.IntegerField()
    max_weight = models.IntegerField()

class Shipping(models.Model):
    country = models.ForeignKey(Country)
    weight = models.ForeignKey(Weight)
    price = models.DecimalField(max_digits=7, decimal_places=2)

Каков наиболее правильный способ импорта в базу данных с помощью файла json?

Должен ли я конвертировать файл json в файл фикстура? Но что делать со связями между таблицами? Или лучше написать view как:

f = open('file.json', 'r')
obj = simplejson.load(f)

for o in obj:
    record = Country(name = o)
    record.save()

Но также не могу понять, как сделать отношения между models.

Или есть более простой способ?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 15 октября 2012

Используйте manage.py для импорта приборов:

python manage.py loaddata fixture.json
3 голосов
/ 10 марта 2012

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

Хороший пример, на мой взгляд, хорошо структурированного json - это вывод сериализации Django.Вы можете посмотреть на это здесь .

2 голосов
/ 10 марта 2012

Хорошо для данных в json для заполнения в базу данных:

  • Вам необходимо отобразить поля данных из json в базу данных.

  • Лучший и предпочтительный или, скорее, разработанный способ сделать это - использовать приборы.

  • Для картирования в Django Serialization есть способ GO .

0 голосов
/ 30 ноября 2018

Django сильно эволюционировал с тех пор, как был задан этот вопрос. В Django 2.x, вероятно, лучший способ с наименьшим количеством введенных зависимостей - это использовать встроенные в Django сериализаторы (как упомянуто @ miki725) и миграции данных . Это позволит загружать ваши данные всякий раз, когда вы запускаете миграции (в том числе когда миграции выполняются до запуска модульных тестов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...