Rumah >pembangunan bahagian belakang >Tutorial Python >Lambakan data JSON ke Model Django: Menggunakan Persediaan dan Perintah Django

Lambakan data JSON ke Model Django: Menggunakan Persediaan dan Perintah Django

王林
王林asal
2024-08-16 18:01:36648semak imbas

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

Keperluan data menjadi paling penting apabila anda melengkapkan versi pertama tapak web anda menggunakan Django atau REST API menggunakan Django Rest Framework (DRF). Untuk masalah yang sama, saya telah menulis artikel saya sebelum ini, di mana, saya telah membincangkan pendekatan langsung untuk membuang data JSON ke dalam model Django dengan memasukkan terus ke pangkalan data dan jadual SQLite. Walau bagaimanapun, saya juga telah menyebut bahawa Django mempunyai loaddata, dumpdata dan lekapan untuk masalah yang sama tetapi itu memerlukan sedikit pemahaman tentang rangka kerja.

Hari ini, saya akan mengembara keluk pembelajaran itu dan membincangkan cara menukar data JSON biasa anda kepada lekapan dan kemudian menggunakan loaddata untuk membuang data JSON ke dalam model tertentu. Begitu juga, jika anda mempunyai beberapa data untuk model (boleh ditambah melalui halaman pentadbir dsb.) maka bagaimana untuk membuangnya sebagai lekapan untuk digunakan dengan model lain atau digunakan dalam projek lain.

Artikel sebelumnya mempunyai dua bahagian: Bahagian pertama ialah persediaan biasa yang diperlukan untuk lambakan data dan bahagian kedua, ialah mengenai skrip python untuk membuang data JSON ke dalam model. Jadi, pastikan artikel itu pendek, Dalam artikel ini, saya akan mulakan dari bahagian kedua dan anda boleh mengikuti Bahagian -I dari artikel sebelumnya untuk mengikuti artikel ini. Jadi, dengan mengandaikan anda mempunyai aplikasi buku dan di dalamnya terdapat model Buku di dalam models.py, begitu juga titik akhir API sudah sedia, seperti (repo Github dari catatan sebelumnya):
http://127.0.0.1:8000/api/books/1

atau anda hanya mahu memuatkan data ke model Buku untuk tapak web berasaskan Django. Anda boleh mengikuti kod daripada mengikuti repositori git.
Lambakan Data JSON ke Model

Memandangkan dua repositori, anda boleh menggunakan sesiapa sahaja untuk mengikuti artikel dari sini, anda hanya perlu perkara berikut:

  1. Projek Django yang berfungsi dengan model Buku dengan atau tanpa ciri API
  2. Fail json yang mempunyai maklumat buku mengikut model Buku.

Contoh 1 : Model Buku dalam 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"
  }
]

Contoh 2: Model Buku daripada artikel sebelumnya

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

Anda boleh mencari fail data.json di sini.

Lambakan Data kepada model

Kami mempunyai projek Django yang berfungsi dengan model Buku dan fail JSON tambahan yang mempunyai maklumat buku. Jadi, sekarang apa masalahnya?
Kami ingin membuang data JSON ke dalam model supaya boleh sama ada digunakan dengan tapak web Django (contohnya menghantar data ke templat untuk paparan kepada pengguna) atau menyampaikan data melalui API ke bahagian hadapan.

Django mempunyai data muatan, lekapan dan dumpdata, di sepanjang sisi halaman pentadbir (anda boleh mendaftarkan model anda dan memasukkan data) dan shell (untuk memanipulasi pangkalan data secara langsung menggunakan SQL atau ORM). Walau bagaimanapun, memuatkan data melalui lekapan kelihatan lebih baik jika ingin menggabungkan data yang besar atau ingin melakukannya berkali-kali (selalunya kes kegunaan semasa pembangunan dan ujian).

Mari mulakan dengan menerangkan alatan ini dan kemudian akan menyelami skrip python untuk mencapai tugas lambakan data.

Muatkan data

$django-admin loaddata <fixture label>

Perlawanan

Lekapan ialah koleksi fail yang mengandungi kandungan bersiri pangkalan data. Setiap lekapan mempunyai nama yang unik, dan fail yang terdiri daripada lekapan boleh diedarkan melalui berbilang direktori, dalam berbilang aplikasi. [sumber]

Mari beralih ke bahagian artikel yang akan datang dan lihat pada perlawanan buku.

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

Jika anda melihat pada fail lekapan, anda pasti mendapati bahawa ia hanyalah satu lagi fail JSON dengan lebih banyak pasangan nilai kunci dan itu adalah metadata untuk model /jadual Django. Jadi, ya, anda betul dan matlamat kami untuk menukar format books.json kami kepada format lekapan supaya alat pentadbir Django akan mengenalinya dan membuang data dalam jadual yang sesuai.

Sekarang, untuk mencipta lekapan, anda boleh mempunyai dua situasi: 1) anda mempunyai data dalam model dan anda mahu mencipta lekapan untuk kegunaan atau ujian masa hadapan, dsb.
2) Anda tidak mempunyai data dalam model/jadual tetapi anda mempunyai data dalam sumber luaran seperti json, csv atau mana-mana format lain dan anda mahu memuatkan data tersebut dalam Django melalui perintah loaddata yang dibincangkan sebelum ini.( Ini artikel adalah mengenai situasi ini tetapi pada penghujungnya, kami akan menggunakan dumpdata untuk membandingkan output manual dan dumpdata.)

Sebelum pergi ke skrip python untuk menukar fail json biasa kepada format lekapan, mari fahami cara Django mencari fail lekapan dan cara menggunakannya.

Terdapat tiga tempat menarik dan pesanan [sumber]:

  1. Dalam direktori lekapan setiap aplikasi yang dipasang : Ini serupa dengan pengesyoran untuk direktori lain seperti templat atau media atau folder statik yang dianjurkan di dalam projek Django. Walau bagaimanapun, anda juga boleh memberikan laluan terus seperti yang dinyatakan di bawah.

  2. Dalam mana-mana direktori yang disenaraikan dalam tetapan 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.

Atas ialah kandungan terperinci Lambakan data JSON ke Model Django: Menggunakan Persediaan dan Perintah Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn