«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Сброс данных JSON в модели Django: использование настроек и команд Django

Сброс данных JSON в модели Django: использование настроек и команд Django

Опубликовано 2 сентября 2024 г.
Просматривать:691

Dumping JSON data to Django Models: Using Django Setup and Commands

Потребность в данных становится наиболее важной, когда вы создаете свою первую версию веб-сайта с использованием Django или REST API с использованием Django Rest Framework (DRF). Для решения аналогичной проблемы я написал свою предыдущую статью, в которой обсудил прямой подход к выгрузке данных JSON в модель Django путем вставки непосредственно в базу данных и таблицы SQLite. Тем не менее, я также упомянул, что в Django есть данные загрузки, данные дампа и приспособления для решения подобных проблем, но для этого требуется немного больше понимания структуры.

Сегодня я собираюсь пройти этот путь обучения и обсудить, как преобразовать ваши обычные данные JSON в приспособление, а затем использовать loaddata для выгрузки данных JSON в конкретную модель. Аналогично, если у вас есть какие-то данные для моделей (могут быть добавлены через страницу администратора и т. д.), то как их выгрузить в качестве приспособлений для использования с другой моделью или в другом проекте.

Предыдущая статья состоит из двух частей: первая часть — это обычная настройка, необходимая для дампа данных, а вторая часть — о скрипте Python для выгрузки данных JSON в модель. Итак, сделайте статью короткой. В этой статье я начну со второй части, а вы можете следовать Части I из предыдущей статьи, чтобы следовать этой статье. Итак, если у вас есть приложение-книга, в котором внутри models.py есть модель книги, аналогичным образом готовы конечные точки API, например (репозиторий Github из предыдущего поста):
http://127.0.0.1:8000/api/books/1

или вы просто хотите загрузить данные в модель Book для веб-сайта на базе Django. Вы можете следовать коду из следующего репозитория git.
Сброс данных JSON в модель

Учитывая два репозитория, вы можете использовать любой для подписки на статью отсюда, вам просто нужны следующие вещи:

  1. Рабочий проект Django, имеющий модель Book с функциями API или без них
  2. JSON-файл, содержащий информацию о книге в соответствии с моделью Book.

Пример 1: Модель книги в book/models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)    
    isbn = models.CharField(max_length=13, unique=True)
    pages = models.PositiveIntegerField()   
    language = models.CharField(max_length=30)

    def __str__(self):
        return self.title

books.json

[
  {
    "title": "Example Book 1",
    "author": "John Doe",
    "isbn": "1234567890123",
    "pages": 350,
    "language": "English"
  },
  {
    "title": "Example Book 2",
    "author": "Kumar Ajit",
    "isbn": "9876543210987",
    "pages": 280,
    "language": "Hindi"
  }
]

Пример 2: модель «Книга» из предыдущей статьи

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.title

Вы можете найти файл data.json здесь.

Сброс данных в модель

У нас есть рабочий проект Django с моделью Книга и дополнительным файлом JSON, содержащим информацию о книгах. Итак, в чем же проблема?
Мы хотим загрузить данные JSON в модель, чтобы их можно было либо использовать с веб-сайтом Django (например, передавать данные в шаблон для отображения пользователю), либо передавать данные через API во внешний интерфейс.

Django имеет данные загрузки, фикстуры и данные дампа, а также страницу администратора (вы можете зарегистрировать свою модель и вставлять данные) и оболочку (для прямого управления базой данных с помощью SQL или ORM). Однако загрузка данных через фикстуры кажется более удобной, если вы хотите объединить большие данные или хотите сделать это много раз (часто используется во время разработки и тестирования).

Давайте начнем с объяснения этих инструментов, а затем углубимся в скрипт Python для выполнения задачи дампа данных.

Загрузить данные

$django-admin loaddata 

Светильники

Фикстура — это набор файлов, содержащих сериализованное содержимое базы данных. Каждый прибор имеет уникальное имя, а файлы, составляющие прибор, могут быть распределены по нескольким каталогам в нескольких приложениях. [источник]

Перейдем к следующей части статьи и посмотрим на книги светильники.

[
  {
    "model": "book.book",
    "pk": 40,
    "fields": {
      "title": "Example Book 1",
      "author": "John Doe",
      "isbn": "123456734890123",
      "pages": 350,
      "language": "English"
    }
  },
  {
    "model": "book.book",
    "pk": 41,
    "fields": {
      "title": "Example Book 2",
      "author": "Kumar Ajit",
      "isbn": "9876543455210987",
      "pages": 280,
      "language": "Hindi"
    }
  }
]

Если вы просмотрели файл фикстуры, вы, должно быть, обнаружили, что это просто еще один файл JSON с большим количеством пар ключ-значение, и это метаданные для моделей/таблиц Django. Итак, да, вы правы, и наша цель — преобразовать наш формат book.json в формат фикстуры, чтобы инструмент администратора Django распознал его и выгрузил данные в подходящие таблицы.

Теперь для создания фикстуры у вас могут быть две ситуации: 1) у вас есть данные в моделях, и вы хотите создать фикстуру для будущего использования или тестирования и т. д.
2) У вас нет данных в моделях/таблицах, но у вас есть данные во внешних источниках, таких как json, csv или любых других форматах, и вы хотите загрузить эти данные в Django с помощью ранее обсуждавшейся команды loaddata .( Это статья посвящена этой ситуации, но ближе к концу мы будем использовать дампданные для сравнения вывода данных вручную и дампа.)

Прежде чем перейти к скрипту Python для преобразования обычного файла json в формат фикстуры, давайте поймем, как Django ищет файл фикстуры и как его использовать.

Есть три точки интереса и порядка [источник]:

  1. В каталоге светильников каждого установленного приложения: это аналогично рекомендации для другого каталога, такого как шаблон, медиа или статическая папка, организованная внутри проекта Django. Однако вы также можете указать прямой путь, как указано ниже.

  2. В любом каталоге, указанном в настройке FIXTURE_DIRS

  3. В буквальном пути, указанном в приспособлении: работает с небольшими проектами или приложениями, но лучше иметь правильное рекомендуемое расположение для приспособлений, чтобы его можно было легко использовать при тестировании, отладке и т. д.

Примечание. Одним из основных преимуществ использования фикстур является применение и использование сжатия к фикстурам.

Дамп данных

Это команда django-admin для вывода всех данных таблицы на стандартный вывод.

Примечание 1. Выводит на стандартный вывод все данные в базе данных, связанные с указанными приложениями.
Примечание 2. Выходные данные dumpdata можно использовать в качестве входных данных для loaddata. (как приспособление)

django-admin dumpdata [app_label[.ModelName] 

Подробнее можно прочитать по этой ссылке.

Скрипт Python от простого json до Django Fixtures.

from django.apps import apps
import django
import os
import json


# Set the Django settings module
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dataloading.settings')
django.setup()

# get all models
models = apps.get_models()

# Get the model names
for model in models:
    print(model)
    print(model.__name__)

# Choose Model to create fixtures
from book.models import Book 

# Get all field names
field_names = [field.name for field in Book._meta.get_fields()]
fixture_name = "books.json"

#read the data file json, csv etc.

with open('data.json','r') as fp:
    books= json.load(fp)


books_fixture =[]
# get the pk value from model , if there is data
pk=1 
# iterate all the books in json file
for book in books:
    book_fixture={}
    # Add model name (most important for fixture)
    book_fixture['model']= 'book.book'
    pk =1
    book_fixture['pk']=pk
    # assuming the data has same fields name as model else mapping is required
    book_fixture['fields']=book
    books_fixture.append(book_fixture)
# Writing converted Json as file for fixture

with open(fixture_name,'w') as fp:
    json.dump(books_fixture,fp)

# print(field_names)
# if __name__ =='__main__' :
    #create_book()  

Как только ваше приспособление будет создано как book.json. Пришло время переместить его/скопировать в подходящее место (book/fixtures/book/), чтобы менеджер Django мог легко его найти, а затем запустить команду loaddata, чтобы сбросить все данные в модель Book.

$mv books.json book/fixtures/book/
$python manage.py loaddata book/fixtures/book/books.json

Вы также можете использовать аналогичный скрипт для прямой записи данных в модель, используя метод .save(). Ниже приведен метод create_book(), который можно использовать для вставки одной или нескольких (циклических) записей данных в модель книги.

# def create_book():
#     book = Book(
#         title="This is from script",
#         author ="ajit",
#         isbn = "2024-0809",
#         pages=300,
#         language ='English'
#     )
#     book.save()
#     print(f'Book {book.title} by {book.author} created.')

Вы также можете просмотреть Dumpscript из расширений Django для аналогичной задачи.

Надеюсь, это будет полезно.

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/ajitkumar/dumping-json-data-to-django-models-using-django-setup-and-commands-1hj2?1 Если есть какие-либо нарушения, свяжитесь с Study_golang. @163.com удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3