แพ็คเกจนี้ช่วยให้นักพัฒนาซอฟต์แวร์ fill ข้อมูลจริงด้วย real data แทนที่จะเติมด้วยตนเอง
ข้อมูลสามารถนำเสนอเป็น CSV File JSON File หรือ in-code
Dependency-Injection ยังสามารถฉีดตรรกะของคุณได้โดยการระบุ serializer_class หรือเขียนวิธี seed ที่กำหนดเองของคุณ
การติดตั้งโดยใช้ PIP:
pip install django-seeding:
เพิ่ม 'django_seeding' ลงในการตั้งค่า INSTALLED_APPS ของคุณ:
INSTALLED_APPS = [
...
'django_seeding',
]
ลองมาดูตัวอย่างอย่างรวดเร็วของการใช้ CSVFileModelSeeder Seeder จาก django-seeding เพื่อสร้าง seeder ง่าย ๆ เพื่อแทรกข้อมูลในฐานข้อมูล
django_seeding_example/models.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
ตอนนี้คุณเพียงแค่ต้องเรียกใช้คำสั่งนี้:
python manage.py seed
ตอนนี้ให้ลึกลงไปในประเภท seeders ที่แตกต่างกันด้วยรายละเอียด:
โมเดล .. Seeder ต้องการ model -แอททริบิว
Serializer .. Seeder ต้องการ serializer_class คลาส-แอททริบิว
csvfile..seeder ต้องการ csv_file_path class-attribute
jsonfile .. SEEDER ต้องการ json_file_path Class-Attribute
id: str (แนะนำ)
นี่คือสิ่งที่จะเก็บไว้ในตาราง Appliedseeder เพื่อตรวจสอบว่ามีการใช้ seeder แล้วหรือไม่
ขอแนะนำให้ตั้งค่าเป็นชื่อ seeder
ดังนั้นตั้งค่าและอย่าเปลี่ยนเพราะเมื่อมีการเปลี่ยนแปลงค่าจะถูกพิจารณาว่าเป็น seeder ใหม่และมันจะถูกนำไปใช้อีกครั้งแม้จะใช้ seeder เก่าที่มีชื่อเก่า
ค่าเริ่มต้น: str(type(seeder))
priority: int|float
Seeders จะถูกจัดเรียงขึ้นอยู่กับคุณลักษณะนี้ (ต่ำกว่าอันดับแรก)
ค่าเริ่มต้น: float('inf')
just_debug: bool
แอตทริบิวต์นี้ระบุว่า seeder จะถูกนำไปใช้เมื่อเซิร์ฟเวอร์อยู่ในโหมดการผลิตหรือไม่ขึ้นอยู่กับตัวแปรดีบั๊กในไฟล์การตั้งค่า
DEBUG=False & just_debug=True -> ไม่สมัคร
DEBUG=False & just_debug=False -> ใช้
DEBUG=True & just_debug=False -> ใช้
DEBUG=True & just_debug=True -> ใช้
ค่าเริ่มต้น: False
@SeederRegistry.register เป็นมัณฑนากรที่ลงทะเบียน seeder ดังนั้นหากไม่มีการใช้งานมัณฑนากรนี้นักเพาะเมล็ดจะไม่ถูกนำไปใช้
แบบจำลอง seeders ใช้วิธี BULK_CREATE ดังนั้นจึงเร็วกว่า Serializer Seeders
Seeders เด็กใช้วิธี BULK_CREATE ด้วยการดึงแคชสำหรับวัตถุที่เกี่ยวข้องดังนั้นพวกเขาจะเร็วกว่า serializer seeders
ตัวอ่านไฟล์ CSV ใช้แพนด้าเพื่อประสิทธิภาพที่ดีขึ้นและมีข้อบกพร่องน้อยลง
การใช้ Seeders Model หมายถึงชื่อฟิลด์จะต้องตรงกับฟิลด์ที่คุณกำหนดไว้ในโมเดลของคุณ
การใช้ Serializer Seeders หมายความว่าชื่อฟิลด์จะต้องตรงกับฟิลด์ที่คุณกำหนดไว้ใน Serializer ของคุณ
คุณสามารถกำหนด methods get_ คลาสแทนคลาส-attributes ดังต่อไปนี้:
python manage.py seed
python manage.py runserver --seed
SEEDING_ON_RUNSERVER = True
SEEDING_ON_RUNSERVER=True ในไฟล์การตั้งค่าของคุณคุณสามารถหยุดการเพาะใน runserver โดยใช้อาร์กิวเมนต์ --dont-seed พันธุ์ python manage.py runserver --dont-seed
โดยค่าเริ่มต้นคำสั่ง SEED จะใช้การตั้งค่าการดีบักจากการตั้งค่าโครงการ Django ของคุณ อย่างไรก็ตามคุณสามารถแทนที่สิ่งนี้ได้โดยผ่านตัวเลือก -DEBUG อย่างชัดเจนเมื่อเรียกใช้คำสั่ง
บังคับให้ดีบักเป็นจริง:
python manage.py seed --debug=True
บังคับให้ดีบักเป็นเท็จ:
python manage.py seed --debug=False
หากไม่มีการระบุค่าสำหรับ -debug คำสั่งจะกลับไปสู่การตั้งค่าการดีบักปัจจุบันของโครงการ
ในการจัดการผู้เพาะเมล็ดจากแผงควบคุมเราให้บริการ API ที่ให้การควบคุมอย่างเต็มที่เกี่ยวกับการดำเนินงานของ seeder
กำหนดเส้นทางมุมมอง Django-seeding ใน urls 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
กำหนดเส้นทางแอพ Seeder ของเราในโครงการ urls.py:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
คุณสามารถปรับแต่งสิทธิ์หรือตรรกะอื่น ๆ โดยการสืบทอดชุดมุมมองที่ให้มาและแทนที่วิธีการที่จำเป็นเพื่อให้เป็นไปตามข้อกำหนดของโครงการเฉพาะของคุณ
เพื่อให้ง่ายขึ้นสำหรับคุณในการทดสอบ APIs เราได้จัดเตรียมคอลเลกชันบุรุษไปรษณีย์ที่มีจุดสิ้นสุด API ทั้งหมด คุณสามารถดาวน์โหลดคอลเลกชันและนำเข้าสู่ Postman เพื่อการทดสอบที่ง่ายและรวดเร็ว
ขั้นตอนในการใช้คอลเลกชันบุรุษไปรษณีย์:
ในแพ็คเกจนี้จะต้องลงทะเบียนคลาส Seeder เพื่อใช้ จุดปลายนี้ช่วยให้คุณ:
แสดงรายการ Seeders ที่ลงทะเบียนทั้งหมด: ซึ่งรวมถึง Seeders ทั้งที่ใช้และไม่ใช้งาน
Get /registered-seeders/
ใช้ seeders เฉพาะ: คุณสามารถใช้ seeders ทั้งหมดหรือเลือกเฉพาะ
โพสต์ /registered-seeders/seed-all/
เราสามารถระบุโหมดการดีบักสำหรับการเพาะและ ID ที่จำเป็นที่จะได้รับการเพาะในร่างกายเช่นนี้ (ทั้งสองเป็นทางเลือก - สามารถเป็นโมฆะ):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
Seeders ที่ใช้จะถูกติดตามในรูปแบบเฉพาะเพื่อป้องกันไม่ให้พวกเขาถูกนำไปใช้หลายครั้ง จุดสิ้นสุดของ seeder ที่ใช้ให้การจัดการเต็มรูปแบบผ่านบันทึก seeder ที่ใช้ช่วยให้คุณสามารถ:
แสดงรายการ Seeders ที่ใช้ทั้งหมด: ดู seeders ทั้งหมดที่ใช้
Get /applied-seeders/
ดึงผู้ใช้ที่ใช้เฉพาะ: ดูรายละเอียดของผู้เพาะเมล็ดเฉพาะ
รับ /applied-seeders/{id}/
ทำเครื่องหมาย seeder ตามที่ใช้: สร้างระเบียนในโมเดล seeder ที่ใช้เพื่อระบุว่าได้ถูกนำไปใช้
โพสต์ /applied-seeders/
ขอร่าง:
{
"id": "id"
}
อัปเดตบันทึก seeder: มีประโยชน์สำหรับการเปลี่ยนรหัสของ seeder
put /applied-seeders/{id}/
ขอร่าง:
{
"id": "new_id"
}
ลบ seeder ที่ใช้เฉพาะ: ลบบันทึกเพื่อทำเครื่องหมาย seeder ว่าไม่ได้ใช้
DELETE /applied-seeders/{id}/
ลบ Seeders ที่ใช้ทั้งหมด: สิ่งนี้จะช่วยให้ผู้เพาะเมล็ดทุกคนสามารถนำมาใช้ใหม่ได้
DELETE /applied-seeders/delete-all/
ID: int (Primary Key)
CreateD_at: datetime
updated_at: datetime
ที่นี่เราจะลึกลงไปในชั้นเรียน Seeders และรายละเอียดของมัน
fast bulk_create seeder
ขอให้สังเกตว่าชื่อใน csv-file ต้องตรงกับชื่อฟิลด์ใน model
models.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
ขอให้สังเกตว่าปุ่มใน json-file ต้องตรงกับชื่อฟิลด์ใน model
models.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"
}
]
Seeder bulk-create ขึ้นอย่างรวดเร็วนำไปใช้กับกลยุทธ์การแคช
ผู้เพาะเมล็ดนี้ถูกคิดให้เป็นแบบจำลองของเด็กเช่นแบบจำลองที่อย่างน้อยหนึ่งฟิลด์เป็นคีย์ต่างประเทศ ( models.ForeignKey ต่างประเทศ) แต่สามารถใช้แทน JSONFileModelSeeder สำหรับแบบจำลองทั่วไปได้เช่นกัน
ขอให้สังเกตว่าปุ่มใน json-file ต้องตรงกับชื่อฟิลด์ใน model และโครงสร้าง โมเดลหลักจะแสดงเป็นคำสั่งภายใน
models.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 " }
}
]ขอให้สังเกตว่าลำดับความสำคัญของเด็กจะต้องมากกว่าความสำคัญของผู้ปกครองเพื่อให้แบบจำลองผู้ปกครองได้รับการเพาะเมล็ดมาก่อน ไม่ใช่การเพาะเชื้อพ่อแม่ก่อนที่จะทำให้เกิดข้อผิดพลาด! แต่ละฟิลด์ที่เป็น FK จะต้องเป็นพจนานุกรมที่มีชื่อฟิลด์เหมือนกับโมเดลที่เกี่ยวข้อง
คลาส Seeder นี้สามารถจัดการกับความสัมพันธ์ที่ซับซ้อนระหว่างโมเดล มาขยายครอบครัวกันเถอะ (ตั้งใจเล่นสำนวน):
models.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/granyseeder.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 " }
}
}
]ช้าลงแบบหนึ่งต่อหนึ่ง
ขอให้สังเกตว่าชื่อใน csv-file ต้องตรงกับชื่อฟิลด์ใน serializer
seeder นี้ใช้เพื่อฉีด serializer เพื่อใช้งานสร้างตรรกะที่กำหนดเอง
models.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
ช้าลงแบบหนึ่งต่อหนึ่ง
โปรดสังเกตว่าปุ่มใน json-file ต้องจับคู่ชื่อฟิลด์ใน serializer
seeder นี้ใช้เพื่อฉีด serializer เพื่อใช้งานสร้างตรรกะที่กำหนดเอง
models.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
models.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
ขอให้สังเกตว่าปุ่มในคลาส data -แอททริบิวจะต้องตรงกับชื่อฟิลด์ใน model
models.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"
},
]
ช้าลงแบบหนึ่งต่อหนึ่ง
โปรดสังเกตว่าปุ่มในคลาส data -แอตทริบิวต์จะต้องตรงกับชื่อฟิลด์ใน serializer
seeder นี้ใช้เพื่อฉีด serializer เพื่อใช้งานสร้างตรรกะที่กำหนดเอง
models.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"
},
]
ที่นี่คุณสามารถเขียนตรรกะของคุณได้ตามที่คุณต้องการในวิธีการเมล็ดพันธุ์
models.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')
หากคุณมีข้อเสนอแนะว่าจะปรับปรุงการเพาะ Django ได้อย่างไรหรือต้องการรายงานข้อผิดพลาดเปิดปัญหา! เรารักทุกอย่างและการมีส่วนร่วมใด ๆ
สำหรับข้อมูลเพิ่มเติมลองดูคู่มือการสนับสนุน
suliman awad - [email protected] - LinkedIn
ลิงค์โครงการ: https://github.com/suliman-99/django-seeding
ใบอนุญาต MIT
ลิขสิทธิ์ (c) 2023 Suliman awad
สำหรับข้อมูลเพิ่มเติมตรวจสอบไฟล์ใบอนุญาต