「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JSON データを Django モデルにダンプ: Django セットアップとコマンドを使用する

JSON データを Django モデルにダンプ: Django セットアップとコマンドを使用する

2024 年 9 月 2 日に公開
ブラウズ:936

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

データの必要性が最も重要になるのは、Django または Django Rest Framework (DRF) を使用した REST API を使用して Web サイトの最初のバージョンを完成させるときです。同様の問題について、私は以前の記事を書きました。そこでは、JSON データを SQLite データベースとテーブルに直接挿入することで Django モデルにダンプする直接的なアプローチについて説明しました。ただし、Django には同様の問題に対するロードデータ、ダンプデータ、フィクスチャがあるが、フレームワークについてもう少し理解する必要があることも述べました。

今日は、その学習曲線をたどって、通常の JSON データをフィクスチャに変換し、loaddata を使用して JSON データを特定のモデルにダンプする方法について説明します。同様に、モデルのデータがある場合 (管理ページなどで追加できる)、それを他のモデルで使用したり、他のプロジェクトで使用したりするためのフィクスチャとしてダンプする方法。

前の記事は 2 つの部分に分かれています。最初の部分はデータのダンプに必要な通常のセットアップであり、2 番目の部分は JSON データをモデルにダンプするための Python スクリプトについてです。したがって、記事は短くしてください。この記事では、第 2 部から始めます。前の記事のパート I に従ってこの記事を続けてください。したがって、書籍アプリがあり、models.py 内に書籍モデルがあると仮定すると、同様に、(前の投稿の Github リポジトリ) :
のような API エンドポイントの準備が整います。 http://127.0.0.1:8000/api/books/1

または、単に Django ベースの Web サイトの Book モデルにデータをロードしたい場合もあります。次の git リポジトリからコードをたどることができます。
モデルへの JSON データのダンプ

リポジトリが 2 つある場合、ここから記事をフォローするために誰でも使用できます。必要なものは次のとおりです:

  1. API 機能の有無にかかわらず Book モデルを含む動作する Django プロジェクト
  2. Book モデルに従って書籍情報を含む json ファイル。

例 1 : book/models.py の Book モデル

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: 前の記事の Book モデル

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 ファイルはここにあります。

モデルへのデータダンプ

モデル Book と書籍情報を含む追加の JSON ファイルを含む、動作する Django プロジェクトがあります。それで、今何が問題になっているのでしょうか?
JSON データをモデルにダンプして、Django Web サイトで使用したり (たとえば、ユーザーに表示するためにデータをテンプレートに渡す)、または 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 モデル /テーブルのメタデータであることがわかったはずです。はい、おっしゃるとおりです。私たちの目的は、books.json 形式をフィクスチャ形式に変換して、Django 管理ツールがそれを認識し、適切なテーブルにデータをダンプできるようにすることです。

さて、フィクスチャを作成するには 2 つの状況が考えられます: 1) モデルにデータがあり、将来の使用やテストなどのためにフィクスチャを作成したいと考えています。
2)モデル/テーブルにはデータはありませんが、json、csv、またはその他の形式のような外部ソースにデータがあり、前述のコマンド loaddata を介してそのデータを Django にロードしたいとします。(これはこの記事ではこの状況について説明していますが、最後の方では、dumpdata を使用して手動出力と dumpdata 出力を比較します。)

通常の json ファイルをフィクスチャ形式に変換する Python スクリプトに進む前に、Django がどのようにフィクスチャ ファイルを検索し、それをどのように使用するかを理解してください。

興味のあるポイントと順序は 3 つあります [出典]:

  1. インストールされているすべてのアプリケーションのフィクスチャ ディレクトリ内 : これは、Django プロジェクト内で編成されたテンプレート、メディア、静的フォルダーなどの他のディレクトリの推奨事項と同様です。ただし、以下のように直接パスを指定することもできます。

  2. FIXTURE_DIRS 設定にリストされている任意のディレクトリ内

  3. フィクスチャによって名前が付けられたリテラル パス内: 小規模なプロジェクトまたはアプリで動作しますが、テストやデバッグなどで使いやすいように、フィクスチャの適切な推奨場所を用意することをお勧めします。

注: フィクスチャを使用する主な利点の 1 つは、フィクスチャに圧縮を適用して使用できることです。

ダンプデータ

テーブルの全データを標準出力に出力するdjango-adminコマンドです。

注 1: 指定されたアプリケーションに関連付けられたデータベース内のすべてのデータを標準出力に出力します。
注 2 : dumpdata の出力は、loaddata.(as fixture)
の入力として使用できます。

django-admin dumpdata [app_label[.ModelName] 

このリンクから詳細を読むことができます。

シンプルな JSON から Django フィクスチャへの Python スクリプト。

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()  

フィクスチャがbooks.jsonとして作成されたら。 Django マネージャーが簡単に見つけられるように、適切な場所 (book/fixtures/book/) に移動/コピーし、loaddata コマンドを実行してすべてのデータを Book モデルにダンプします。

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

同様のスクリプトを使用して、モデルの sing .save() メソッドにデータを直接書き込むこともできます。以下は、1 つ以上の (ループ) データ レコードを Book モデルに挿入するために使用できる 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.')

同様のタスクについては、Django 拡張機能の Dumpscript を調べることもできます。

お役に立てば幸いです。

注: 時間の制約により、この記事は適切に校正およびフォーマットされていません。したがって、慎重に使用し、間違い、疑問、質問があった場合は、以下にコメントを残してください。時間外に返信して記事を編集します。

リリースステートメント この記事は次の場所に転載されています: 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