ホームページ >バックエンド開発 >Python チュートリアル >JSON データを Django モデルにダンプ: Django セットアップとコマンドを使用する

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

王林
王林オリジナル
2024-08-16 18:01:36650ブラウズ

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 <fixture label>

備品

フィクスチャは、データベースのシリアル化されたコンテンツを含むファイルのコレクションです。各フィクスチャには一意の名前があり、フィクスチャを構成するファイルは複数のアプリケーションの複数のディレクトリに分散できます。 [出典]

記事の今後の部分にジャンプして、書籍の備品を見てみましょう。

[
  {
    "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 出力を比較します。)

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

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

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

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

  3. In the literal path named by the fixture: Works with smaller project or app but it is better to have a proper recommended location for fixtures so it will easy to use with testing or debugging etc.

Note:One major benefit of using fixture is to apply and use compression on fixtures.

Dumpdata

This is django-admin command to output all data of table to standard output.

Note 1: Outputs to standard output all data in the database associated with the named application(s).
Note 2 : The output of dumpdata can be used as input for loaddata.(as fixture )

django-admin dumpdata [app_label[.ModelName] 

you can read more from this link.

Python script from simple json to 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()  

Once your fixture is created as books.json. It time to move it /copy to suitable location (book/fixtures/book/) so that Django manager can find it easily and then run loaddata command to dump all data to Book model.

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

You can also use similar script to directly write data to model sing .save() method. Below is create_book() method that can be use to insert one or more (looping) data records into Book model.

# 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.')

You can also look into Dumpscript from Django-extensions for similar task.

I hope it will be helpful.

Note: The article in not properly proofread and formatted because of time constraint. So, please use it carefully and leave comments below for any errors, dobuts or questions. I will reply and edit the article overtime.

以上がJSON データを Django モデルにダンプ: Django セットアップとコマンドを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。