Этот пакет помогает разработчикам 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 из 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/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
Теперь давайте углубимся в различные типы сеялок с его деталями:
Модель .. Seeder нуждается в model классов
Serializer..seeder нужен serializer_class Class-Attribute
Csvfile..seeder нуждается в csv_file_path Class-Attribute
Jsonfile..seeder нуждается в json_file_path class-attribute
id: str (так рекомендуется)
Это то, что будет храниться в таблице AppliedeDer, чтобы проверить, уже применяется или нет.
Рекомендуется установить его как название сеялки
Итак, установите его и не меняйте его, потому что, когда значение будет изменено, оно будет рассматриваться как новая сеялка, и оно будет применено еще раз, даже то, что старая сеялка со старым именем применяется
Значение по умолчанию: str(type(seeder))
priority: int|float
Seeders будут отсортированы в зависимости от этого атрибута (более низкий уровень)
Значение по умолчанию: 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 File Reader использует Pandas для лучшей производительности и меньше ошибок
Использование модели Seeders означает, что имена поля должны соответствовать полям, которые вы определили в своей модели
Использование сеятельщиков Serializer означает, что названия поля должны соответствовать полям, которые вы определили в своем сериализаторе
Вы можете определить 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 при запуске команды.
Отладка силы до True:
python manage.py seed --debug=True
Отладка силы до ложного:
python manage.py seed --debug=False
Если для -debug не указано значение, команда вернется к текущей настройке отладки проекта.
Чтобы управлять сеялками из приборной панели, мы предоставляем API, которые предлагают полный контроль над операциями сеялки.
Маршрут Django-Seeding Views в нашем приложении Seeder 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
Наше приложение Seederer в проекте urls.py:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
Вы можете настроить разрешения или любую другую логику, унаследовав предоставленные виды и переопределив необходимые методы для удовлетворения ваших конкретных требований проекта.
Чтобы вам было легче проверить API, мы предоставили коллекцию почтальона, содержащую все конечные точки API. Вы можете скачать коллекцию и импортировать ее в Postman для быстрого и легкого тестирования.
Шаги по использованию коллекции почтальона:
В этом пакете классы сеялки должны быть зарегистрированы для применения. Эта конечная точка позволяет вам:
Перечислите все зарегистрированные сеялки: это включает в себя как прикладные, так и не применяемые сеялки.
Получить /registered-seeders/
Примените конкретные сеялки: вы можете применить все сеялки или выбрать конкретные.
Post /registered-seeders/seed-all/
Мы можем указать режим отладки для посева и необходимых идентификаторов, которые должны быть посеяны в теле, как это (оба они необязательны - могут быть нулевыми):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
Применяемые сеялки отслеживаются в специальной модели, чтобы предотвратить их применение несколько раз. Прикладные конечные точки сеялки обеспечивают полное управление над прикладными записями сеялки, что позволяет вам:
Перечислите все прикладные сеялки: просмотреть все сеялки, которые были применены.
Get /applied-seeders/
Получить конкретную прикладную сеялку: просмотреть детали конкретной сеялки.
Get /applied-seeders/{id}/
Отметьте сеялку в качестве применения: создайте запись в приложенной модели Seeder, чтобы указать, что она была применена.
Post /applied-seeders/
Запросить тело:
{
"id": "id"
}
Обновите запись сеялки: полезно для изменения идентификатора сеялки.
PUT /applied-seeders/{id}/
Запросить тело:
{
"id": "new_id"
}
Удалите конкретный применяемый сеялок: удаляет запись, чтобы отметить сеялку, как не применяемое.
Delete /applied-seeders/{id}/
Удалить все приложенные сеялки: это позволяет повторно нанести все сеялки.
Delete /applied-seeders/delete-all/
ID: int (Primary Key)
create_at: datetime
updated_at: datetime
Здесь мы пойдем глубже в классах Seeders и его деталях
Fast bulk_create Seeder
Обратите внимание, что названия в csv-file должны соответствовать именам поля в model
модели.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
модели.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 , а также структуре. Родительские модели представлены как внутренние дамбы.
модели.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, должно быть словарем с именами поля, такого же, как связанная с ней модель.
Этот класс сеялки может справляться с довольно сложными отношениями между моделями. Давайте расширим семью (каламбур):
модели.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/DAIGHTSEEDER.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
Этот сеялок используется для внедрения сериализатора для реализации пользовательской логики создания логики
модели.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
Этот сеялок используется для внедрения сериализатора для реализации пользовательской логики создания логики
модели.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
модели.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
модели.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
Этот сеялок используется для внедрения сериализатора для реализации пользовательской логики создания логики
модели.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"
},
]
Здесь вы можете написать свою логику так, как хотите в методе семян
модели.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-seding
MIT Лицензия
Авторские права (с) 2023 Сулиман Авад
Для получения дополнительной информации, ознакомьтесь с файлом лицензии.