Потребность в данных становится наиболее важной, когда вы создаете свою первую версию веб-сайта с использованием 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: Модель книги в 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 ищет файл фикстуры и как его использовать.
Есть три точки интереса и порядка [источник]:
В каталоге светильников каждого установленного приложения: это аналогично рекомендации для другого каталога, такого как шаблон, медиа или статическая папка, организованная внутри проекта Django. Однако вы также можете указать прямой путь, как указано ниже.
В любом каталоге, указанном в настройке FIXTURE_DIRS
В буквальном пути, указанном в приспособлении: работает с небольшими проектами или приложениями, но лучше иметь правильное рекомендуемое расположение для приспособлений, чтобы его можно было легко использовать при тестировании, отладке и т. д.
Примечание. Одним из основных преимуществ использования фикстур является применение и использование сжатия к фикстурам.
Это команда django-admin для вывода всех данных таблицы на стандартный вывод.
Примечание 1. Выводит на стандартный вывод все данные в базе данных, связанные с указанными приложениями.
Примечание 2. Выходные данные dumpdata можно использовать в качестве входных данных для loaddata. (как приспособление)
django-admin dumpdata [app_label[.ModelName]
Подробнее можно прочитать по этой ссылке.
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 для аналогичной задачи.
Надеюсь, это будет полезно.
Примечание: статья не проверена и не отформатирована должным образом из-за нехватки времени. Поэтому, пожалуйста, используйте его осторожно и оставляйте комментарии ниже, если есть ошибки, сомнения или вопросы. Я отвечу и отредактирую статью сверхурочно.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3