このパッケージは、開発者が手動で入力するのではなく、 real dataでデータベースfillのに役立ちます。
データは、 CSV File 、 JSON File 、またはin-codeとして表示できます。
Dependency-Injection serializer_classを指定したり、カスタムseedメソッドを書いたりすることにより、ロジックを注入するために利用できます。
PIPを使用してインストール:
pip install django-seeding:
INSTALLED_APPS設定に'django_seeding'を追加します:
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..Seederには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 > apply
DEBUG=True & just_debug=False > apply
DEBUG=True & just_debug=True > apply
デフォルト値: False
@SeederRegistry.registerはシーダーを登録するデコレーターです。したがって、この装飾器が適用されない場合、シーダーは適用されません
モデルシーダーはbulk_createメソッドを使用するため、シリアナーシーダーよりも高速です
チャイルドシーダーは、関連するオブジェクトのキャッシュフェッチを備えたbulk_createメソッドを使用しているため、シリアイザーシーダーよりも高速です
CSVファイルリーダーはパンダを使用してパフォーマンスを向上させ、バグを減らしています
モデルシーダーを使用すると、フィールド名はモデルで定義したフィールドと一致する必要があります
Serializerシーダーを使用すると、フィールド名はシリアルで定義したフィールドと一致する必要があります
以下のように、class-attributesの代わりにget_ class-methodsを定義できます。
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のsettings.pyのデバッグ設定を使用します。ただし、コマンドを実行するときに-debugオプションを明示的に渡すことにより、これをオーバーライドできます。
デバッグを真に強制します:
python manage.py seed --debug=True
デバッグを偽に強制します:
python manage.py seed --debug=False
-debugの値が指定されていない場合、コマンドはプロジェクトの現在のデバッグ設定に戻ります。
ダッシュボードからシーダーを管理するために、シーダー操作を完全に制御する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
Project urls.pyでシーダーアプリをルーティングします:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
提供されたビューセットを継承し、特定のプロジェクト要件を満たすために必要な方法をオーバーライドすることにより、アクセス許可またはその他のロジックをカスタマイズできます。
APIのテストを容易にするために、すべてのAPIエンドポイントを含むPostmanコレクションを提供しました。コレクションをダウンロードして、迅速かつ簡単なテストのためにポストマンにインポートできます。
ポストマンコレクションを使用する手順:
このパッケージでは、シーダークラスを適用するために登録する必要があります。このエンドポイントを使用すると、次のことができます。
すべての登録シーダーをリストします:これには、適用されたシーダーと非適用シーダーの両方が含まれます。
Get /registered-seeders/
特定のシーダーを適用します:すべてのシーダーを適用するか、特定のシードを選択できます。
ポスト/registered-seeders/seed-all/
シードにデバッグモードを指定し、必要なIDをこのように体内にシードすることができます(どちらもオプションです - ヌルになる可能性があります):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
適用されたシーダーは、それらが複数回適用されないように、専用モデルで追跡されます。 Applied Seederのエンドポイントは、Applied Seeder Recordsよりも完全な管理を提供し、次のことを可能にします。
すべての適用されたシーダーをリストします:適用されたすべてのシーダーを表示します。
get /applied-seeders/
特定の適用シーダーを取得:特定のシーダーの詳細を表示します。
get /applied-seeders/{id}/
適用されたシーダーにマークを付けます:Applied Seederモデルにレコードを作成して、適用されていることを示します。
ポスト/applied-seeders/
リクエストボディ:
{
"id": "id"
}
シーダーレコードの更新:シーダーのIDを変更するのに役立ちます。
put /applied-seeders/{id}/
リクエストボディ:
{
"id": "new_id"
}
特定の適用シーダーを削除します:記録を削除して、シーダーに適用されていないとマークします。
delete /applied-seeders/{id}/
すべての適用されたシーダーを削除します:これにより、すべてのシーダーが再適用されます。
delete /applied-seeders/delete-all/
ID: int (Primary Key)
created_at: datetime
updated_at: datetime
ここでは、シーダーのクラスとその詳細をより深くします
高速bulk_createシーダー
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
高速bulk_createシーダー
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"
}
]
キャッシング戦略で実装された、Blinky Fast bulk-create Seeder。
このシーダーは、子どものモデル、つまり少なくとも1つのフィールドが外部キー( models.ForeignKey )であるが、一般的なモデルにもJSONFileModelSeeder代わりに使用できるというモデルをシードするために考案されました。
json-fileのキーは、 modelのフィールド名と構造と一致する必要があることに注意してください。親モデルは内部dictとして表されます。
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である各フィールドは、関連するモデルと同じフィールド名を持つ辞書でなければなりません。
このシーダークラスは、モデル間のかなり複雑な関係を処理できます。家族を拡張しましょう(意図したしゃれ):
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/DAUGHANTEEDER.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 " }
}
}
]1つごとのシーダーを遅くします
csv-fileのタイトルは、 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
1つごとのシーダーを遅くします
json-fileのキーは、 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"
}
]
高速bulk_createシーダー
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
高速bulk_createシーダー
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"
},
]
1つごとのシーダーを遅くします
dataクラスアトリブのキーは、 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 Seedingをどのように改善できるかについての提案がある場合、またはバグを報告したい場合は、問題を開きます!すべての貢献とあらゆる貢献が大好きです。
詳細については、寄稿ガイドをご覧ください。
Suliman Awad [email protected] -LinkedIn
プロジェクトリンク:https://github.com/suliman-99/django-seeding
MITライセンス
Copyright(c)2023 Suliman Awad
詳細については、ライセンスファイルをご覧ください。