データの必要性が最も重要になるのは、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 : 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 つあります [出典]:
インストールされているすべてのアプリケーションのフィクスチャ ディレクトリ内 : これは、Django プロジェクト内で編成されたテンプレート、メディア、静的フォルダーなどの他のディレクトリの推奨事項と同様です。ただし、以下のように直接パスを指定することもできます。
FIXTURE_DIRS 設定にリストされている任意のディレクトリ内
フィクスチャによって名前が付けられたリテラル パス内: 小規模なプロジェクトまたはアプリで動作しますが、テストやデバッグなどで使いやすいように、フィクスチャの適切な推奨場所を用意することをお勧めします。
注: フィクスチャを使用する主な利点の 1 つは、フィクスチャに圧縮を適用して使用できることです。
テーブルの全データを標準出力に出力するdjango-adminコマンドです。
注 1: 指定されたアプリケーションに関連付けられたデータベース内のすべてのデータを標準出力に出力します。
注 2 : dumpdata の出力は、loaddata.(as fixture)
の入力として使用できます。
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()
フィクスチャが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 を調べることもできます。
お役に立てば幸いです。
注: 時間の制約により、この記事は適切に校正およびフォーマットされていません。したがって、慎重に使用し、間違い、疑問、質問があった場合は、以下にコメントを残してください。時間外に返信して記事を編集します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3