تساعد هذه الحزمة المطورين على 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 لبناء بذور بسيطة لإدراج البيانات في قاعدة البيانات.
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/beaders.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/beaders_data/m1seeder.csv:
title,description
t1,d1
t2,d2
الآن تحتاج فقط إلى تشغيل هذا الأمر:
python manage.py seed
الآن دعنا نتعمق أكثر في أنواع البذور المختلفة بتفاصيلها:
النموذج .. يحتاج model
Serializer..seeder يحتاج إلى serializer_class class-attribute
csvfile..seeder يحتاج إلى csv_file_path class-attribute
jsonfile..seeder يحتاج إلى json_file_path class-attribute
id: str (موصى به جدًا)
هذا هو ما سيتم تخزينه في جدول Appliedseeder للتحقق مما إذا كان البذور قد تم تطبيقه بالفعل أم لا
يوصى بتعيينه كاسم البذور
لذا ، قم بتعيينه ولا تغيره لأنه عندما يتم تغيير القيمة ، فسيتم اعتبارها بذرة جديدة وسيتم تطبيقها مرة أخرى حتى يتم تطبيق البذور القديم مع الاسم القديم
القيمة الافتراضية: str(type(seeder))
priority: int|float
سيتم فرز البذور اعتمادًا على هذه السمة (الدنيا الأولى)
القيمة الافتراضية: float('inf')
just_debug: bool
تحدد هذه السمة ما إذا كان سيتم تطبيق البذور عندما يكون الخادم في وضع الإنتاج أو لا يعتمد على متغير التصحيح في ملف الإعدادات
DEBUG=False & just_debug=True -> لا تنطبق
DEBUG=False & just_debug=False -> pray
DEBUG=True & just_debug=False -> pray
DEBUG=True & just_debug=True -> تطبيق
القيمة الافتراضية: False
@SeederRegistry.register هو الديكور الذي يسجل البذور ، لذلك ، إذا لم يتم تطبيق هذا الديكور ، فلن يتم تطبيق البذور
يستخدم البذور النموذجيون طريقة bulk_create ، لذلك ، فهي أسرع من بذور المسلسل
يستخدم بذور الأطفال طريقة bulk_create مع جلب التخزين المؤقت للكائنات ذات الصلة ، لذلك ، فهي أسرع من بذور التسلسل
يستخدم قارئ ملفات CSV Pandas لأداء أفضل وأقل الأخطاء
استخدام البذور النموذجية يعني أن أسماء الحقول يجب أن تتطابق مع الحقول التي حددتها في النموذج الخاص بك
استخدام بذور المسلسل يعني أن أسماء الحقول يجب أن تتطابق مع الحقول التي حددتها في المسلسل الخاص بك
يمكنك تحديد Methods get_ بدلاً من الفئة على النحو التالي:
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 ، فسوف يعود الأمر إلى إعداد التصحيح الحالي للمشروع.
لإدارة البذور من لوحة القيادة ، نقدم واجهات برمجة التطبيقات التي توفر التحكم الكامل في عمليات البذور.
توجيه وجهات نظر بذرة Django في url urls.
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')),
...
]
...
يمكنك تخصيص الأذونات أو أي منطق آخر من خلال ورث المشاهدات المقدمة وإلغاء الأساليب اللازمة لتلبية متطلبات المشروع المحددة.
لتسهيل اختبار واجهات برمجة التطبيقات ، قمنا بتوفير مجموعة Postman التي تحتوي على جميع نقاط نهاية API. يمكنك تنزيل المجموعة واستيرادها إلى ساعي البريد للاختبار السريع والسهل.
خطوات لاستخدام مجموعة Postman:
في هذه الحزمة ، يجب تسجيل فئات البذور ليتم تطبيقها. تتيح لك نقطة النهاية هذه:
قائمة جميع البذور المسجلة: وهذا يشمل كلا من البذور التطبيقية وغير المطبق.
الحصول على /registered-seeders/
تطبيق بذور محددة: يمكنك تطبيق جميع البذور أو تحديد البذور المحددة.
ما بعد /registered-seeders/seed-all/
يمكننا تحديد وضع التصحيح للبذر ومعرفات المعرفات المطلوبة في الجسم مثل هذا (كلاهما اختياري - يمكن أن يكون فارغًا):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
يتم تتبع البذور المطبقة في نموذج مخصص لمنعها من تطبيقها عدة مرات. توفر نقاط نهاية البذور المطبقة إدارة كاملة على سجلات البذور المطبقة ، مما يتيح لك:
قائمة جميع البذور المطبقة: عرض جميع البذور التي تم تطبيقها.
الحصول على /applied-seeders/
استرجاع بذور مطبق محددة: عرض تفاصيل بذور معينة.
Get /applied-seeders/{id}/
حدد البذور كما هو مطبق: قم بإنشاء سجل في نموذج البذور المطبق للإشارة إلى أنه تم تطبيقه.
بعد /applied-seeders/
طلب الجسم:
{
"id": "id"
}
تحديث سجل البذور: مفيد لتغيير معرف البذور.
put /applied-seeders/{id}/
طلب الجسم:
{
"id": "new_id"
}
حذف البذور المطبقة المحددة: يزيل سجلًا لتمييز البذور على أنه غير مطبق.
حذف /applied-seeders/{id}/
حذف جميع البذور المطبقة: هذا يسمح لإعادة تطبيق جميع البذور.
حذف /applied-seeders/delete-all/
المعرف: int (Primary Key)
تم إنشاؤه _at: datetime
updated_at: datetime
هنا سنتعمق في فصول البذور وتفاصيلها
بسرعة bulk_create البذور
لاحظ أن العناوين الموجودة في csv-file يجب أن تتطابق مع أسماء الحقول في model
النماذج
class M1(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
البذور
@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
بسرعة bulk_create البذور
لاحظ أن المفاتيح الموجودة في json-file يجب أن تتطابق مع أسماء الحقول في model
النماذج
class M2(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
البذور
@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"
}
]
bulk-create بليكي بليك بائسة تم تنفيذها مع استراتيجية التخزين المؤقت.
تم تصور هذا البذور لبذور نماذج الأطفال JSONFileModelSeeder أي نماذج أن حقل واحد على الأقل هو مفتاح خارجي ( models.ForeignKey .
لاحظ أن المفاتيح الموجودة في json-file يجب أن تتطابق مع أسماء الحقول في model وأيضًا الهيكل. يتم تمثيل نماذج الوالدين على أنها ديكتات داخلية.
النماذج
class Father ( models . Model ):
name = models . TextField ()
class Son ( models . Model ):
name = models . TextField ()
father = models . ForeignKey ( Father , on_delete = models . CASCADE )البذور
@ 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 قاموسًا مع أسماء الحقول مثل نموذجه ذي الصلة.
يمكن أن تتعامل فئة البذور هذه مع العلاقات المعقدة بين النماذج. دعنا نوسع الأسرة (المقصود التورية):
النماذج
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 )البذور
@ 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/suponnseeder.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 " }
}
}
]بطيئة بذرة واحدة تلو الأخرى
لاحظ أن العناوين الموجودة في csv-file يجب أن تتطابق مع أسماء الحقول في serializer
يتم استخدام هذا البذور لحقن المسلسل لتنفيذ منطق إنشاء مخصص
النماذج
class M3(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
مسلسلات
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)
البذور
@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
يتم استخدام هذا البذور لحقن المسلسل لتنفيذ منطق إنشاء مخصص
النماذج
class M4(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
مسلسلات
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)
البذور
@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"
}
]
بسرعة bulk_create البذور
النماذج
class M5(models.Model):
title = models.CharField(max_length=100, null=True)
description = models.TextField(null=True)
البذور
@SeederRegistry.register
class M5Seeder(seeders.EmptySeeder):
id = 'M5Seeder'
priority = 5
model = M5
records_count = 2
بسرعة bulk_create البذور
لاحظ أن المفاتيح الموجودة في فئة data يجب أن تتطابق مع أسماء الحقول في model
النماذج
class M6(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
البذور
@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
يتم استخدام هذا البذور لحقن المسلسل لتنفيذ منطق إنشاء مخصص
النماذج
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)
البذور
@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"
},
]
هنا يمكنك كتابة منطقك كما تريد في طريقة البذور
النماذج
class Post(models.Model):
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.TextField()
البذور
@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-iseding
رخصة معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (C) 2023 Suliman Awad
لمزيد من المعلومات ، تحقق من ملف الترخيص.