該軟件包可幫助開發人員用real data fill數據庫,而不是手動填充數據庫。
數據可以作為CSV File , JSON File或in-code表示。
還可以通過指定Dependency-Injection或編寫自定義seed方法serializer_class注入邏輯。
使用PIP安裝:
pip install django-seeding:
將'django_seeding'添加到您的INSTALLED_APPS設置:
INSTALLED_APPS = [
...
'django_seeding',
]
讓我們看一下從django-seeding使用CSVFileModelSeeder 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
現在,讓我們深入了解不同的播種機類型的細節:
模型..種子需求model類屬性
serializer..seeder需要serializer_class class-attribute
csvfile..seeder需要csv_file_path class-attribute
jsonfile..seeder需要json_file_path class-attribute
id: str (推薦)
這是將存儲在應用程序表中以檢查播種機是否已經應用的東西
建議將其設置為播種機名稱
因此,將其設置並且不要更改它,因為當值更改時,它將被視為新的播種機,即使應用了帶有舊名稱的舊播種機,也將再次應用它
默認值: str(type(seeder))
priority: int|float
播種機將根據此屬性(第一個)進行排序
默認值: float('inf')
just_debug: bool
此屬性指定服務器在生產模式中時是否會在設置文件中的調試變量中應用
DEBUG=False & just_debug=True >不應用
DEBUG=False & just_debug=False >應用
DEBUG=True & just_debug=False >應用
DEBUG=True & just_debug=True >應用
默認值: False
@SeederRegistry.register是註冊播種機的裝飾器,因此,如果不應用此裝飾器,則不會應用播種機
模型播種機使用Bulk_Create方法,因此,它們比串行器播種機快
兒童播種機使用bulk_create方法與相關對象的緩存獲取,因此,它們比串行器播種機快
CSV文件讀取器正在使用pandas來獲得更好的性能和更少的錯誤
使用模型播種機意味著字段名稱必須與您在模型中定義的字段匹配
使用串行器播種機意味著字段名稱必須匹配您在序列化器中定義的字段
您可以定義get_ class-hethods,而不是以下類:
python manage.py seed
python manage.py runserver --seed
SEEDING_ON_RUNSERVER = True
SEEDING_ON_RUNSERVER=True則可以使用--dont-seed參數停止在runserver中播種 python manage.py runserver --dont-seed
默認情況下,SEED命令將使用您的Django Project的設置中的調試設置。但是,您可以在運行命令時明確傳遞-Debug選項來覆蓋此問題。
強制調試到真實:
python manage.py seed --debug=True
強迫調試到錯誤:
python manage.py seed --debug=False
如果未為 - 示例指定值,則該命令將返回到項目當前的調試設置。
為了從儀表板管理播種機,我們提供對播種機操作的完全控制的API。
我們的SEEDER應用程序urls.py中的Django-seeding視圖:
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
在項目urls.py中路由我們的播種機應用程序:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
您可以通過繼承提供的視圖集並覆蓋必要的方法來自定義權限或任何其他邏輯,以滿足您的特定項目要求。
為了使您更容易測試API,我們提供了一個包含所有API端點的Postman集合。您可以下載該集合併將其導入到Postman中,以進行快速簡便的測試。
使用Postman集合的步驟:
在此軟件包中,必須註冊播種機類才能應用。此終點使您可以:
列出所有註冊的播種機:這包括應用和未應用的播種機。
獲取/registered-seeders/
應用特定的播種機:您可以使用所有播種機或選擇特定的播種機。
郵寄/registered-seeders/seed-all/
我們可以指定播種的調試模式,並像這樣將所需的ID在體內播種(它們都是可選的 - 可以為null):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
在專用模型中跟踪應用的播種機,以防止它們多次應用。應用的播種機端點可在應用的播種機記錄上提供完整的管理,使您可以:
列出所有施加的播種機:查看已應用的所有播種機。
獲取/applied-seeders/
檢索特定的施加播種機:查看特定播種機的詳細信息。
get /applied-seeders/{id}/
將播種機標記為應用:在應用的播種機模型中創建記錄以表明已應用。
郵政/applied-seeders/
請求主體:
{
"id": "id"
}
更新播種機記錄:可用於更改播種機的ID。
put /applied-seeders/{id}/
請求主體:
{
"id": "new_id"
}
刪除特定的施加播種機:刪除記錄以將播種機標記為未施加的播種機。
刪除/applied-seeders/{id}/
刪除所有施加的播種機:這允許將所有播種機重新應用。
/applied-seeders/delete-all/
id: int (Primary Key)
create_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播種機。
該播種機被構想為種子兒童模型,即至少一個字段是外鍵( models.ForeignKey ),但也可以用於常規模型而不是JSONFileModelSeeder 。
請注意, 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/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 " }
}
}
]緩慢的一對一播種機
請注意, csv-file中的標題必須匹配serializer中的字段名稱
此播種機用於注入序列化器來實現自定義創建邏輯
模型
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)
播種機
@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()
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)
播種機
@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-seeding
麻省理工學院許可證
版權(C)2023 Suliman Awad
有關更多信息,請查看許可證文件。