Paket ini membantu pengembang untuk fill database dengan real data alih -alih mengisinya secara manual.
Data dapat disajikan sebagai CSV File , JSON File atau in-code .
Dependency-Injection juga tersedia untuk menyuntikkan logika Anda dengan menentukan serializer_class atau menulis metode seed khusus Anda.
Menginstal Menggunakan Pip:
pip install django-seeding:
Tambahkan 'django_seeding' ke pengaturan INSTALLED_APPS Anda:
INSTALLED_APPS = [
...
'django_seeding',
]
Mari kita lihat contoh cepat menggunakan seeder CSVFileModelSeeder dari django-seeding untuk membangun seeder sederhana untuk memasukkan data dalam database.
django_seeding_example/model.py:
from django.db import models
class M1(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
django_seeding_example/seeders.py:
from django_seeding import seeders
from django_seeding.seeder_registry import SeederRegistry
from django_seeding_example.models import M1
@SeederRegistry.register
class M1Seeder(seeders.CSVFileModelSeeder):
model = M1
csv_file_path = 'django_seeding_example/seeders_data/M1Seeder.csv'
django_seeding_example/seeders_data/m1seeder.csv:
title,description
t1,d1
t2,d2
Sekarang Anda hanya perlu menjalankan perintah ini:
python manage.py seed
Sekarang mari kita masuk lebih dalam ke jenis seeders yang berbeda dengan detailnya:
Model..seeder membutuhkan model -attribute
Serializer..seeder membutuhkan serializer_class -attribute
Csvfile..seeder membutuhkan csv_file_path kelas-attribut
Jsonfile..seeder membutuhkan json_file_path -attribute
id: str (sangat disarankan)
Inilah yang akan disimpan dalam tabel terapan untuk memeriksa apakah seeder sudah diterapkan atau tidak
Disarankan untuk mengaturnya sebagai nama seeder
Jadi, atur dan jangan mengubahnya karena ketika nilainya diubah akan dianggap sebagai seeder baru dan akan diterapkan lagi bahkan bahwa seeder lama dengan nama lama diterapkan
Nilai default: str(type(seeder))
priority: int|float
Seeders akan diurutkan tergantung pada atribut ini (lebih rendah)
Nilai default: float('inf')
just_debug: bool
Atribut ini menentukan apakah seeder akan diterapkan saat server berada di mode produksi atau tidak tergantung pada variabel debug dalam file pengaturan
DEBUG=False & just_debug=True -> jangan berlaku
DEBUG=False & just_debug=False -> apply
DEBUG=True & just_debug=False -> apply
DEBUG=True & just_debug=True -> apply
Nilai default: False
@SeederRegistry.register adalah dekorator yang mendaftarkan seeder, jadi, jika dekorator ini tidak diterapkan maka seeder tidak akan diterapkan
Model seeders menggunakan metode bulk_create, jadi, mereka lebih cepat dari seeder serializer
Seeders anak menggunakan metode bulk_create dengan caching ambil untuk objek terkait, jadi, mereka lebih cepat dari seeder serializer
Pembaca file CSV menggunakan panda untuk kinerja yang lebih baik dan lebih sedikit bug
Menggunakan model seeders berarti nama lapangan harus cocok dengan bidang yang telah Anda tentukan dalam model Anda
Menggunakan seeders serializer berarti nama lapangan harus cocok dengan bidang yang telah Anda tentukan di serializer Anda
Anda dapat mendefinisikan metode get_ class alih-alih atribut kelas seperti di bawah ini:
python manage.py seed
python manage.py runserver --seed
SEEDING_ON_RUNSERVER = True
SEEDING_ON_RUNSERVER=True di file pengaturan Anda, Anda dapat berhenti unggulan dalam runserver dengan menggunakan argumen --dont-seed python manage.py runserver --dont-seed
Secara default, perintah seed akan menggunakan pengaturan debug dari pengaturan proyek Django Anda. Namun, Anda dapat mengesampingkan ini dengan secara eksplisit melewati opsi --debug saat menjalankan perintah.
Memaksa debug ke true:
python manage.py seed --debug=True
Force debug ke false:
python manage.py seed --debug=False
Jika tidak ada nilai yang ditentukan untuk --debug, perintah akan kembali ke pengaturan debug proyek saat ini.
Untuk mengelola seeder dari dasbor, kami menyediakan API yang menawarkan kontrol penuh atas operasi seeder.
Rute pemandangan django-terlihat di aplikasi seeder kami urls.py:
from rest_framework import routers
from django_seeding.apis.views import AppliedSeederViewSet, RegisteredSeederViewSet
router = routers.DefaultRouter()
router.register('registered-seeders', RegisteredSeederViewSet, 'registered-seeders')
router.register('applied-seeders', AppliedSeederViewSet, 'applied-seeders')
urlpatterns = router.urls
Rute aplikasi seeder kami di proyek urls.py:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
Anda dapat menyesuaikan izin atau logika lainnya dengan mewarisi viewset yang disediakan dan mengesampingkan metode yang diperlukan untuk memenuhi persyaratan proyek spesifik Anda.
Agar lebih mudah bagi Anda untuk menguji API, kami telah menyediakan koleksi tukang pos yang berisi semua titik akhir API. Anda dapat mengunduh koleksi dan mengimpornya ke tukang pos untuk pengujian yang cepat dan mudah.
Langkah -langkah untuk menggunakan koleksi tukang pos:
Dalam paket ini, kelas seeder harus terdaftar untuk diterapkan. Titik akhir ini memungkinkan Anda untuk:
Daftar semua seeders terdaftar: Ini termasuk seeder yang diterapkan dan yang tidak diterapkan.
Dapat /registered-seeders/
Oleskan seeder spesifik: Anda dapat menerapkan semua seeder atau memilih yang spesifik.
Post /registered-seeders/seed-all/
Kita dapat menentukan mode debug untuk penyemaian dan ID yang dibutuhkan untuk diunggulkan di dalam tubuh seperti ini (keduanya opsional - bisa nol):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
Seeders yang diterapkan dilacak dalam model khusus untuk mencegahnya diterapkan beberapa kali. Titik akhir seeder yang diterapkan memberikan manajemen penuh atas catatan seeder yang diterapkan, memungkinkan Anda untuk:
Sebutkan semua seeder yang diterapkan: Lihat semua seeder yang telah diterapkan.
Get /applied-seeders/
Ambil seeder yang diterapkan spesifik: Lihat detail seeder tertentu.
Get /applied-seeders/{id}/
Tandai seeder seperti yang diterapkan: Buat catatan dalam model seeder yang diterapkan untuk menunjukkan telah diterapkan.
Pasca /applied-seeders/
Badan Permintaan:
{
"id": "id"
}
Perbarui catatan seeder: Berguna untuk mengubah ID seeder.
Put /applied-seeders/{id}/
Badan Permintaan:
{
"id": "new_id"
}
Hapus seeder yang diterapkan spesifik: Menghapus catatan untuk menandai seeder tidak diterapkan.
Hapus /applied-seeders/{id}/
Hapus semua seeder yang diterapkan: Ini memungkinkan semua seeder untuk diterapkan kembali.
Hapus /applied-seeders/delete-all/
ID: int (Primary Key)
create_at: datetime
update_at: datetime
Di sini kita akan masuk lebih dalam di kelas seeders dan detailnya
Fast bulk_create seeder
Perhatikan bahwa judul di csv-file harus mencocokkan nama lapangan dalam model
model.py
class M1(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
seeders.py
@SeederRegistry.register
class M1Seeder(seeders.CSVFileModelSeeder):
id = 'M1Seeder'
priority = 1
model = M1
csv_file_path = 'django_seeding_example/seeders_data/M1Seeder.csv'
seeders_data/m1seeder.csv
title,description
t1,d1
t2,d2
Fast bulk_create seeder
Perhatikan bahwa kunci di json-file harus cocok dengan nama lapangan dalam model
model.py
class M2(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
seeders.py
@SeederRegistry.register
class M2Seeder(seeders.JSONFileModelSeeder):
id = 'M2Seeder'
priority = 2
model = M2
json_file_path = 'django_seeding_example/seeders_data/M2Seeder.json'
seeders_data/m2seeder.json
[
{
"title": "json t1",
"description": "json d1"
},
{
"title": "json t2",
"description": "json d2"
}
]
Blinky-fast bulk-create seeder diimplementasikan dengan strategi caching.
Seeder ini dikandung untuk menemui model anak, yaitu model bahwa setidaknya satu bidang adalah kunci asing ( models.ForeignKey ), tetapi dapat digunakan sebagai pengganti JSONFileModelSeeder untuk model umum juga.
Perhatikan bahwa kunci di json-file harus cocok dengan nama lapangan dalam model dan juga struktur. Model induk direpresentasikan sebagai dikt dalam.
model.py
class Father ( models . Model ):
name = models . TextField ()
class Son ( models . Model ):
name = models . TextField ()
father = models . ForeignKey ( Father , on_delete = models . CASCADE )seeders.py
@ SeederRegistry . register
class SonSeeder ( seeders . JSONFileChildSeeder ):
id = 'SonSeeder'
model = Son
priority = 10
json_file_path = 'django_seeding_example/seeders_data/SonSeeder.json'seeders_data/sonseeder.json
[
{
"name" : " json son 1 " ,
"father" : { "name" : " json father 1 " }
},
{
"name" : " json son 2 " ,
"father" : { "name" : " json father 2 " }
}
]Perhatikan bahwa prioritas anak harus lebih besar dari prioritas orang tua agar model induk diunggulkan sebelumnya. Tidak menyemai orang tua sebelumnya akan meningkatkan kesalahan! Setiap bidang yang merupakan FK harus menjadi kamus dengan nama bidang yang sama dengan model terkait.
Kelas seeder ini dapat menangani hubungan yang cukup kompleks antara model. Mari kita perluas keluarga (pun intended):
model.py
class Mother ( models . Model ):
name = models . TextField ()
class Daughter ( models . Model ):
name = models . TextField ()
father = models . ForeignKey ( Father , on_delete = models . CASCADE )
mother = models . ForeignKey ( Mother , on_delete = models . CASCADE )
class Meta :
constraints = [
UniqueConstraint (
fields = [ 'name' , 'father' , 'mother' ],
name = 'unique_parentage'
)]
class Grandson ( models . Model ):
name = models . TextField ()
parentage = models . ForeignKey ( Daughter , on_delete = models . CASCADE )seeders.py
@ SeederRegistry . register
class DaughterSeeder ( seeders . JSONFileChildSeeder ):
id = 'DaughterSeeder'
priority = 10
model = Daughter
json_file_path = 'django_seeding_example/seeders_data/DaughterSeeder.json'
@ SeederRegistry . register
class GrandsonSeeder ( seeders . JSONFileChildSeeder ):
id = 'GrandsonSeeder'
model = Grandson
json_file_path = 'django_seeding_example/seeders_data/GrandsonSeeder.json'seeders_data/daughterseeder.json
[
{
"name" : " json daughter 1 " ,
"father" : { "name" : " json father 1 " },
"mother" : { "name" : " json mother 1 " }
},
{
"name" : " json daughter 2 " ,
"father" : { "name" : " json father 2 " },
"mother" : { "name" : " json mother 2 " }
}
]seeders_data/grandsonseeder.json
[
{
"name" : " json grandson 1 " ,
"parentage" : {
"name" : " json daughter 1 " ,
"father" : { "name" : " json father 1 " },
"mother" : { "name" : " json mother 1 " }
}
},
{
"name" : " json grandson 2 " ,
"parentage" : {
"name" : " json daughter 2 " ,
"father" : { "name" : " json father 2 " },
"mother" : { "name" : " json mother 2 " }
}
}
]Lamban satu demi satu seeder
Perhatikan bahwa judul di csv-file harus cocok dengan nama lapangan di serializer
Seeder ini digunakan untuk menyuntikkan serializer untuk mengimplementasikan logika kustom
model.py
class M3(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Serializers.py
class M3Serializer(serializers.ModelSerializer):
class Meta:
model = M3
fields = ['title', 'description']
def create(self, validated_data):
validated_data['title'] = '__' + validated_data['title'] + '__'
validated_data['description'] = '__' + validated_data['description'] + '__'
return super().create(validated_data)
seeders.py
@SeederRegistry.register
class M3Seeder(seeders.CSVFileSerializerSeeder):
id = 'M3Seeder'
priority = 3
serializer_class = M3Serializer
csv_file_path = 'django_seeding_example/seeders_data/M3Seeder.csv'
seeders_data/m3seeder.csv
title,description
t1,d1
t2,d2
Lamban satu demi satu seeder
Perhatikan bahwa kunci di json-file harus cocok dengan nama lapangan di serializer
Seeder ini digunakan untuk menyuntikkan serializer untuk mengimplementasikan logika kustom
model.py
class M4(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Serializers.py
class M4Serializer(serializers.ModelSerializer):
class Meta:
model = M4
fields = ['title', 'description']
def create(self, validated_data):
validated_data['title'] = '__' + validated_data['title'] + '__'
validated_data['description'] = '__' + validated_data['description'] + '__'
return super().create(validated_data)
seeders.py
@SeederRegistry.register
class M4Seeder(seeders.JSONFileSerializerSeeder):
id = 'M4Seeder'
priority = 4
serializer_class = M4Serializer
json_file_path = 'django_seeding_example/seeders_data/M4Seeder.json'
seeders_data/m4seeder.json
[
{
"title": "json t1",
"description": "json d1"
},
{
"title": "json t2",
"description": "json d2"
}
]
Fast bulk_create seeder
model.py
class M5(models.Model):
title = models.CharField(max_length=100, null=True)
description = models.TextField(null=True)
seeders.py
@SeederRegistry.register
class M5Seeder(seeders.EmptySeeder):
id = 'M5Seeder'
priority = 5
model = M5
records_count = 2
Fast bulk_create seeder
Perhatikan bahwa kunci di atribut kelas data harus mencocokkan nama bidang dalam model
model.py
class M6(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
seeders.py
@SeederRegistry.register
class M6Seeder(seeders.ModelSeeder):
id = 'M6Seeder'
priority = 6
model = M6
data = [
{
"title": "in-code t1",
"description": "in-code d1"
},
{
"title": "in-code t2",
"description": "in-code d2"
},
]
Lamban satu demi satu seeder
Perhatikan bahwa kunci di atribut kelas data harus sesuai dengan nama bidang di serializer
Seeder ini digunakan untuk menyuntikkan serializer untuk mengimplementasikan logika kustom
model.py
class M7(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Serializer.py
class M7Serializer(serializers.ModelSerializer):
class Meta:
model = M7
fields = ['title', 'description']
def create(self, validated_data):
validated_data['title'] = '__' + validated_data['title'] + '__'
validated_data['description'] = '__' + validated_data['description'] + '__'
return super().create(validated_data)
seeders.py
@SeederRegistry.register
class M7Seeder(seeders.SerializerSeeder):
id = 'M7Seeder'
priority = 7
serializer_class = M7Serializer
data = [
{
"title": "in-code t1",
"description": "in-code d1"
},
{
"title": "in-code t2",
"description": "in-code d2"
},
]
Di sini Anda dapat menulis logika seperti yang Anda inginkan dalam metode benih
model.py
class Post(models.Model):
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.TextField()
seeders.py
@SeederRegistry.register
class CustomSeeder(seeders.Seeder):
id = 'CustomSeeder'
priority = 8
def seed(self):
post1 = Post.objects.create(content='post1')
post2 = Post.objects.create(content='post1')
comment1 = Comment.objects.create(post=post1, content='comment1')
comment2 = Comment.objects.create(post=post1, content='comment2')
comment3 = Comment.objects.create(post=post2, content='comment3')
comment4 = Comment.objects.create(post=post2, content='comment4')
Jika Anda memiliki saran tentang bagaimana penyemaian Django dapat ditingkatkan, atau ingin melaporkan bug, buka masalah! Kami akan menyukai semua dan kontribusi apa pun.
Untuk lebih lanjut, lihat panduan yang berkontribusi.
Suliman Awad - [email protected] - LinkedIn
Tautan Proyek: https://github.com/suliman-99/django-seeding
Lisensi MIT
Hak Cipta (C) 2023 Suliman Awad
Untuk lebih lanjut, lihat file lisensi.