Django 또는 DRF(Django Rest Framework)를 사용하는 REST API를 사용하여 첫 번째 웹 사이트 버전을 완성할 때 데이터의 필요성이 가장 중요해집니다. 유사한 문제에 대해 이전 기사를 작성했는데, 여기서는 SQLite 데이터베이스 및 테이블에 직접 삽입하여 JSON 데이터를 Django 모델에 덤프하는 직접적인 접근 방식에 대해 논의했습니다. 그러나 Django에는 유사한 문제에 대한 로드 데이터, 덤프 데이터 및 고정 장치가 있지만 프레임워크에 대한 더 많은 이해가 필요하다는 점도 언급했습니다.
오늘 저는 학습 곡선을 여행하고 일반 JSON 데이터를 고정 장치로 변환한 다음 loaddata를 사용하여 JSON 데이터를 특정 모델에 덤프하는 방법에 대해 논의하겠습니다. 마찬가지로 모델에 대한 일부 데이터가 있는 경우(관리 페이지 등을 통해 추가될 수 있음) 이를 다른 모델이나 다른 프로젝트에서 사용하기 위해 고정물로 덤프하는 방법입니다.
이전 기사는 두 부분으로 구성되어 있습니다. 첫 번째 부분은 데이터 덤프에 필요한 일반 설정이고 두 번째 부분은 JSON 데이터를 모델에 덤프하는 Python 스크립트에 관한 것입니다. 따라서 기사를 짧게 유지하세요. 이 기사에서는 두 번째 부분부터 시작하고 이전 기사의 Part -I을 따라 이 기사를 따라갈 수 있습니다. 따라서 책 앱이 있고 models.py 내부에 Book 모델이 있다고 가정하면 마찬가지로 (이전 게시물의 Github 저장소) :
와 같은 API 엔드포인트가 준비됩니다.
http://127.0.0.1:8000/api/books/1
또는 단순히 Django 기반 웹사이트의 Book 모델에 데이터를 로드하려고 합니다. 다음 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: 이전 기사의 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는 데이터베이스의 직렬화된 내용을 포함하는 파일 모음입니다. 각 조명기는 고유한 이름을 가지며, 조명기를 구성하는 파일은 여러 응용 프로그램의 여러 디렉토리에 배포될 수 있습니다. [원천]
기사의 다음 부분으로 이동하여 책 비품을 살펴보겠습니다.
[ { "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가지가 있습니다. [출처]:
설치된 모든 애플리케이션의 조명기 디렉터리: 이는 Django 프로젝트 내부에 구성된 템플릿, 미디어 또는 정적 폴더와 같은 다른 디렉터리에 대한 권장 사항과 유사합니다. 그러나 아래 언급된 것처럼 직접 경로를 제공할 수도 있습니다.
FIXTURE_DIRS 설정에 나열된 모든 디렉토리에서
Fixture에 의해 명명된 리터럴 경로: 소규모 프로젝트나 앱에서 작동하지만 테스트나 디버깅 등에 사용하기 쉽도록 적절한 권장 위치를 갖는 것이 더 좋습니다.
참고: 고정 장치 사용의 주요 이점 중 하나는 고정 장치에 압축을 적용하고 사용하는 것입니다.
테이블의 모든 데이터를 표준 출력으로 출력하는 django-admin 명령입니다.
참고 1: 명명된 응용 프로그램과 관련된 데이터베이스의 모든 데이터를 표준 출력으로 출력합니다.
참고 2: dumpdata의 출력은 loaddata의 입력으로 사용될 수 있습니다.(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()
Fixture가 books.json으로 생성되면. 이제 Django 관리자가 쉽게 찾을 수 있도록 /copy를 적절한 위치(book/fixtures/book/)로 이동한 다음 loaddata 명령을 실행하여 모든 데이터를 Book 모델에 덤프해야 합니다.
$mv books.json book/fixtures/book/ $python manage.py loaddata book/fixtures/book/books.json
유사한 스크립트를 사용하여 .save() 메소드를 사용하여 모델에 데이터를 직접 쓸 수도 있습니다. 다음은 하나 이상의 (루핑) 데이터 레코드를 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