이 패키지는 개발자가 수동으로 채우는 대신 real data 로 데이터베이스를 fill 데 도움이됩니다.
데이터는 CSV File , JSON File 또는 in-code 로 표시 될 수 있습니다.
serializer_class 지정하거나 사용자 정의 seed 메소드를 작성하여 논리를 주입하기 위해 Dependency-Injection 도 사용할 수 있습니다.
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 .. json_file_path 가 필요합니다
id: str (그래서 권장)
씨앗이 이미 적용되었는지 확인하기 위해 AppliedSeeder 테이블에 저장 될 것입니다.
파종자 이름으로 설정하는 것이 좋습니다.
따라서 값이 변경되면 새 파르더로 간주되며 이전 이름을 가진 오래된 시드러가 적용 되더라도 다시 적용되므로 변경하지 마십시오.
기본값 : 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 방법을 사용하므로 시리얼 라이저 시드기보다 빠릅니다.
Child Seeders는 관련 객체에 대한 캐싱 페치와 함께 Bulk_Create 방법을 사용하므로 Serializer 파종기보다 빠릅니다.
CSV 파일 리더는 더 나은 성능과 더 적은 버그를 위해 팬더를 사용하고 있습니다.
모델 파종기 사용 필드 이름이 모델에서 정의한 필드와 일치해야 함을 의미합니다.
시리얼 라이저 파종기 사용 필드 이름은 세리어 라이저에서 정의한 필드와 일치해야 함을 의미합니다.
다음과 같이 클래스-아트 리 부처 대신 get_ class-methods를 정의 할 수 있습니다.
python manage.py seed
python manage.py runserver --seed
SEEDING_ON_RUNSERVER = True
SEEDING_ON_RUNSERVER=True 설정하면 --dont-seed argument를 사용하여 Runserver에서 시드를 중지 할 수 있습니다. python manage.py runserver --dont-seed
기본적으로 Seed 명령은 Django Project의 Settings.py에서 디버그 설정을 사용합니다. 그러나 명령을 실행할 때 -debug 옵션을 명시 적으로 전달하여이를 무시할 수 있습니다.
Debug를 true로 강제로
python manage.py seed --debug=True
거짓으로 디버그를 강제로 :
python manage.py seed --debug=False
-debug에 값이 지정되지 않으면 명령이 프로젝트의 현재 디버그 설정으로 돌아갑니다.
대시 보드에서 시드기를 관리하기 위해 시드러 작업을 완전히 제어 할 수있는 API를 제공합니다.
Seeder App urls.py의 Route 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에서 Seeder 앱을 라우팅하십시오.
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
제공된 뷰셋을 상속하고 특정 프로젝트 요구 사항을 충족하는 데 필요한 방법을 재정의하여 권한 또는 기타 논리를 사용자 정의 할 수 있습니다.
API를보다 쉽게 테스트 할 수 있도록 모든 API 엔드 포인트가 포함 된 우편 컬렉션을 제공했습니다. 빠르고 쉬운 테스트를 위해 컬렉션을 다운로드하여 Postman으로 가져올 수 있습니다.
우편 컬렉션을 사용하는 단계 :
이 패키지에서는 시드러 클래스를 등록하려면 등록해야합니다. 이 엔드 포인트는 다음을 수행 할 수 있습니다.
등록 된 모든 씨앗을 나열하십시오. 여기에는 적용되지 않은 시드기와 적용되지 않은 시드기가 모두 포함됩니다.
get /registered-seeders/
특정 시드기 적용 : 모든 시드기를 적용하거나 특정 시드기를 선택할 수 있습니다.
게시물 /registered-seeders/seed-all/
우리는 파종에 대한 디버그 모드를 지정할 수 있고 이와 같이 몸에 필요한 ID를 시딩해야 할 ID를 지정할 수 있습니다 (둘 다 선택 사항이 될 수 있음).
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
응용 시체는 전용 모델로 추적되어 여러 번 적용되는 것을 방지합니다. 응용 시체 엔드 포인트는 적용된 시드러 레코드에 대한 전체 관리를 제공하므로 다음을 수행 할 수 있습니다.
적용된 모든 시드기를 나열하십시오. 적용 된 모든 시드기를보십시오.
GET /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 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
빠른 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"
}
]
캐싱 전략으로 구현 된 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 인 각 필드는 필드 이름이 관련 모델과 동일한 사전이어야합니다.
이 씨앗 클래스는 모델 간의 꽤 복잡한 관계를 처리 할 수 있습니다. 가족을 확장합시다.
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/budubyseeder.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-10 씨앗
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-10 씨앗
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 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
빠른 bulk_create seeder
data Class-Attribute의 키는 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-10 씨앗
data Class-Attribute의 키는 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
자세한 내용은 라이센스 파일을 확인하십시오.