>백엔드 개발 >파이썬 튜토리얼 >JSON 데이터를 Django 모델에 덤프: Django 설정 및 명령 사용

JSON 데이터를 Django 모델에 덤프: Django 설정 및 명령 사용

王林
王林원래의
2024-08-16 18:01:36655검색

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

Django 또는 Django Rest Framework(DRF)를 사용하는 REST API를 사용하여 첫 번째 웹사이트 버전을 완성할 때 데이터의 필요성이 가장 중요해집니다. 유사한 문제에 대해 이전 기사를 작성했는데, 여기서는 SQLite 데이터베이스 및 테이블에 직접 삽입하여 JSON 데이터를 Django 모델에 덤프하는 직접적인 접근 방식에 대해 논의했습니다. 그러나 Django에는 유사한 문제에 대한 로드 데이터, 덤프 데이터 및 고정 장치가 있지만 프레임워크에 대한 더 많은 이해가 필요하다는 점도 언급했습니다.

오늘은 학습 곡선을 여행하며 일반 JSON 데이터를 픽스처로 변환한 다음 loaddata를 사용하여 JSON 데이터를 특정 모델에 덤프하는 방법에 대해 논의하겠습니다. 마찬가지로, 모델에 대한 일부 데이터가 있는 경우(관리 페이지 등을 통해 추가될 수 있음) 이를 다른 모델이나 다른 프로젝트에서 사용하기 위해 고정물로 덤프하는 방법입니다.

이전 기사는 두 부분으로 구성되어 있습니다. 첫 번째 부분은 데이터 덤프에 필요한 일반 설정이고 두 번째 부분은 JSON 데이터를 모델에 덤프하는 Python 스크립트에 관한 것입니다. 따라서 기사를 짧게 유지하세요. 이 기사에서는 두 번째 부분부터 시작하고 이전 기사의 Part -I을 따라 이 기사를 따라갈 수 있습니다. 따라서 책 앱이 있고 models.py 내부에 Book 모델이 있다고 가정하면 마찬가지로 다음과 같은 API 엔드포인트가 준비됩니다(이전 게시물의 Github 저장소).
http://127.0.0.1:8000/api/books/1

또는 단순히 Django 기반 웹사이트의 Book 모델에 데이터를 로드하고 싶을 수도 있습니다. 다음 git 저장소의 코드를 따라갈 수 있습니다.
JSON 데이터를 모델로 덤프

두 개의 저장소가 주어지면 여기에서 다음 기사를 위해 누구나 사용할 수 있습니다. 다음 사항만 있으면 됩니다.

  1. API 기능이 있거나 없는 Book 모델이 있는 작동 중인 Django 프로젝트
  2. Book 모델에 따른 도서 정보를 담고 있는 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: 이전 기사의 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 프로젝트가 있습니다. 그렇다면 이제 문제는 무엇입니까?
우리는 Django 웹 사이트에서 사용하거나(예: 사용자에게 표시하기 위해 데이터를 템플릿에 전달) API를 통해 프런트엔드에 데이터를 제공할 수 있도록 JSON 데이터를 모델에 덤프하려고 합니다.

Django에는 관리 페이지(모델을 등록하고 데이터를 삽입할 수 있음) 및 쉘(SQL 또는 ORM을 사용하여 데이터베이스를 직접 조작하기 위해) 측면에 로드 데이터, 픽스쳐 및 덤프 데이터가 있습니다. 그러나 대용량 데이터를 병합하거나 여러 번 수행하려는 경우에는 픽스처를 통한 데이터 로드가 더 나은 것 같습니다(종종 개발 및 테스트 중 사용 사례).

이러한 도구에 대한 설명부터 시작하여 데이터 덤핑 작업을 수행하기 위해 Python 스크립트를 살펴보겠습니다.

데이터 로드

$django-admin loaddata <fixture label>

비품

Fixture는 데이터베이스의 직렬화된 콘텐츠를 포함하는 파일 모음입니다. 각 조명기는 고유한 이름을 가지며, 조명기를 구성하는 파일은 여러 응용 프로그램의 여러 디렉터리에 배포될 수 있습니다. [출처]

기사의 다음 부분으로 이동하여 비품을 살펴보세요.

[
  {
    "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"
    }
  }
]

Fixture 파일을 살펴본다면 이것이 더 많은 키-값 쌍을 포함하는 또 다른 JSON 파일이고 Django 모델/테이블에 대한 메타데이터라는 것을 발견했을 것입니다. 네, 맞습니다. 우리의 목표는 books.json 형식을 고정 형식으로 변환하여 Django 관리 도구가 이를 인식하고 적절한 테이블에 데이터를 덤프하도록 하는 것입니다.

이제 픽스처를 생성하려면 두 가지 상황이 있을 수 있습니다. 1) 모델에 데이터가 있고 향후 사용이나 테스트 등을 위해 픽스처를 생성하려는 경우
2) 모델/테이블에는 데이터가 없지만 json, csv 또는 기타 형식과 같은 외부 소스에 데이터가 있고 이전에 설명한 loaddata 명령을 통해 Django에서 해당 데이터를 로드하려고 합니다.( 이 기사는 이 상황에 대한 것이지만 마지막에는 dumpdata를 사용하여 수동 출력과 dumpdata 출력을 비교하겠습니다.)

일반 json 파일을 픽스처 형식으로 변환하기 위해 Python 스크립트로 이동하기 전에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.