Dieses Paket hilft Entwicklern, die Datenbank mit real data zu fill , anstatt sie manuell zu füllen.
Daten können als CSV File , JSON File oder in-code dargestellt werden.
Dependency-Injection ist auch zur Verfügung, um Ihre Logik zu injizieren, indem eine serializer_class angegeben oder Ihre benutzerdefinierte seed geschrieben wird.
Installieren mit PIP:
pip install django-seeding:
Fügen Sie Ihrer Einstellung INSTALLED_APPS 'django_seeding' hinzu:
INSTALLED_APPS = [
...
'django_seeding',
]
Schauen wir uns ein kurzes Beispiel für die Verwendung von CSVFileModelSeeder -Sämader aus django-seeding an, um einen einfachen Seasator zu erstellen, um Daten in die Datenbank einzuführen.
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/Seaser.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/Seasers_Data/m1seeder.csv:
title,description
t1,d1
t2,d2
Jetzt müssen Sie diesen Befehl nur ausführen:
python manage.py seed
Lassen Sie uns nun mit seinen Details tiefer in die verschiedenen Seeders -Typen gehen:
Modell ... SEEDER braucht model
Serializer..Seeder benötigt serializer_class class-attribute
CsvFile..seeder braucht csv_file_path class-attribute
JSONFILE..SEEDER braucht json_file_path CLASS-ATTRIBUTE
id: str (so empfohlen)
Dies wird in der AppliedSeeder -Tabelle gespeichert, um zu prüfen, ob ein Sämaschine bereits angewendet wird oder nicht
Es wird empfohlen, es als Sämaschinenname festzulegen
Setzen Sie es also und ändern Sie es nicht, denn wenn der Wert geändert wird
Standardwert: str(type(seeder))
priority: int|float
Säder werden je nach diesem Attribut sortiert (niedrigere erste)
Standardwert: float('inf')
just_debug: bool
In diesem Attribut wird angegeben, ob der Säator angewendet wird, wenn sich der Server im Produktionsmodus befindet, oder nicht in der Debug-Variablen in der Einstellungsdatei
DEBUG=False & just_debug=True -> Bewerben Sie sich nicht
DEBUG=False & just_debug=False -> anwenden
DEBUG=True & just_debug=False -> anwenden
DEBUG=True & just_debug=True -> anwenden
Standardwert: False
@SeederRegistry.register ist der Dekorateur, der den Säator registriert. Wenn dieser Dekorateur nicht aufgetragen wird, wird der Sämaschine nicht angewendet
Modellsäure verwenden die Bulk_create -Methode, daher sind sie schneller als Serializer -Sämaschinen
Child Sämader verwenden die Bulk_create -Methode mit dem Caching -Abruf für verwandte Objekte, sodass sie schneller sind als Serializer -Sämaschinen
CSV -Dateileser verwendet Pandas für eine bessere Leistung und weniger Fehler
Die Verwendung von Modellsäatern bedeutet, dass die Feldnamen mit den in Ihrem Modell definierten Feldern übereinstimmen müssen
Die Verwendung von Serializer -Seasern bedeutet, dass die Feldnamen den Feldern übereinstimmen, die Sie in Ihrem Serializer definiert haben
Sie können get_ Klasse-Methoden anstelle von Klasse-Attributes wie unten definieren:
python manage.py seed
python manage.py runserver --seed
SEEDING_ON_RUNSERVER = True
--dont-seed SEEDING_ON_RUNSERVER=True einstellen python manage.py runserver --dont-seed
Standardmäßig verwendet der SEED -Befehl die Debug -Einstellung aus den Einstellungen Ihres Django -Projekts. Sie können dies jedoch überschreiben, indem Sie beim Ausführen des Befehls explizit die Option -Debug übergeben.
Erzwingen Sie Debugg zu wahr:
python manage.py seed --debug=True
Erzwingen Sie Debuggen zu falsch:
python manage.py seed --debug=False
Wenn für -Debug kein Wert angegeben wird, fällt der Befehl auf die aktuelle Debug -Einstellung des Projekts zurück.
Um Sämaschinen aus einem Armaturenbrett zu verwalten, bieten wir APIs an, die die volle Kontrolle über den Sämaschinenoperationen bieten.
Route Django-Seting-Ansichten in unseren Seasker-App-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
Leiten Sie unsere Sämamer -App in die Projekt -URLS.PY:
from django.urls import include
...
urlpatterns = [
...
path('seeder/', include('django_seeding_example.urls')),
...
]
...
Sie können die Berechtigungen oder eine andere Logik anpassen, indem Sie die bereitgestellten Ansichten erben und die erforderlichen Methoden zur Erfüllung Ihrer spezifischen Projektanforderungen überschreiben.
Um es Ihnen leichter zu erleichtern, die APIs zu testen, haben wir eine Postmann -Sammlung mit allen API -Endpunkten bereitgestellt. Sie können die Sammlung herunterladen und in Postman importieren, um schnelle und einfache Tests zu testen.
Schritte zur Verwendung der Postman Collection:
In diesem Paket müssen Säatorklassen registriert werden, um angewendet zu werden. Mit diesem Endpunkt ermöglicht es Ihnen:
Listen Sie alle registrierten Sämaschinen auf: Dies schließt sowohl angewandte als auch nicht angewandte Sämaschinen ein.
Get /registered-seeders/
Wenden Sie bestimmte Sämaschinen an: Sie können alle Säder anwenden oder bestimmte auswählen.
Post /registered-seeders/seed-all/
Wir können den Debug -Modus für die Aussaat und die erforderlichen IDs angeben, die im Körper wie dieses ausgesät werden sollen (beide sind optional - können null sein):
{
"debug": true,
"ids": [
"id1",
"id2"
]
}
Angewandte Säter werden in einem dedizierten Modell verfolgt, um zu verhindern, dass sie mehrmals angewendet werden. Die angewendeten Seasästerendpunkte bieten die vollständige Verwaltung über die angewandten Sämaschinensätze, mit denen Sie:
Listen Sie alle angewandten Sekunden auf: Alle angewendeten Sämaschinen anzeigen.
Get /applied-seeders/
Abrufen Sie einen bestimmten angelegten Säator ab: Details eines bestimmten Säators anzeigen.
Get /applied-seeders/{id}/
Markieren Sie einen Sämaschine wie angewendet: Erstellen Sie eine Aufzeichnung im angewendeten Säatormodell, um anzuzeigen, dass es angewendet wurde.
Post /applied-seeders/
Antragsbehörde:
{
"id": "id"
}
Aktualisieren Sie einen Sämamer -Datensatz: Nützlich für die Änderung der ID eines Säatorin.
Put /applied-seeders/{id}/
Antragsbehörde:
{
"id": "new_id"
}
Löschen Sie einen bestimmten angelegten Säator: Entfernt eine Aufzeichnung, um den Säator nicht angewendet zu markieren.
Löschen /applied-seeders/{id}/
Alle angewendeten Sämaschinen löschen: Dadurch können alle Säter erneut angewendet werden.
Löschen /applied-seeders/delete-all/
ID: int (Primary Key)
erstellt_at: datetime
updated_at: datetime
Hier gehen wir tiefer in die Seaser -Klassen und ihre Details
Schneller bulk_create Sämamer
Beachten Sie, dass die Titel im csv-file mit den Feldnamen im model übereinstimmen müssen
Models.py
class M1(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Säder.py
@SeederRegistry.register
class M1Seeder(seeders.CSVFileModelSeeder):
id = 'M1Seeder'
priority = 1
model = M1
csv_file_path = 'django_seeding_example/seeders_data/M1Seeder.csv'
Seasers_Data/M1seeder.csv
title,description
t1,d1
t2,d2
Schneller bulk_create Sämamer
Beachten Sie, dass die Schlüssel im json-file mit den Feldnamen im model übereinstimmen müssen
Models.py
class M2(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Säder.py
@SeederRegistry.register
class M2Seeder(seeders.JSONFileModelSeeder):
id = 'M2Seeder'
priority = 2
model = M2
json_file_path = 'django_seeding_example/seeders_data/M2Seeder.json'
Seasers_Data/m2seeder.json
[
{
"title": "json t1",
"description": "json d1"
},
{
"title": "json t2",
"description": "json d2"
}
]
Blinky-Schneide bulk-create Sämaderin wurde mit Caching-Strategie implementiert.
Dieser Sämaschern wurde zu Saatgutmodellen konzipiert, dh Modelle, dass mindestens ein Feld ein JSONFileModelSeeder ist ( models.ForeignKey .
Beachten Sie, dass die Schlüssel in der json-file mit den Feldnamen im model und auch der Struktur übereinstimmen müssen. Elternmodelle werden als innere Diktate dargestellt.
Models.py
class Father ( models . Model ):
name = models . TextField ()
class Son ( models . Model ):
name = models . TextField ()
father = models . ForeignKey ( Father , on_delete = models . CASCADE )Säder.py
@ SeederRegistry . register
class SonSeeder ( seeders . JSONFileChildSeeder ):
id = 'SonSeeder'
model = Son
priority = 10
json_file_path = 'django_seeding_example/seeders_data/SonSeeder.json'Seasers_Data/Sonseeder.json
[
{
"name" : " json son 1 " ,
"father" : { "name" : " json father 1 " }
},
{
"name" : " json son 2 " ,
"father" : { "name" : " json father 2 " }
}
]Beachten Sie, dass die Priorität von Kindern größer sein muss als die Priorität der Eltern, um das übergeordnete Modell zuvor ausgesät zu haben. Nicht übergeordnete Säenvorlagen werden Fehler hervorrufen! Jedes Feld, das ein FK ist, muss ein Wörterbuch mit Feldnamen sein, die wie sein verwandtes Modell sind.
Diese Säatorklasse kann ziemlich komplexe Beziehungen zwischen Modellen bewältigen. Erweitern wir die Familie (Wortspiel beabsichtigt):
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 )Säder.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'Seaser_Data/Tochterseeder.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 " }
}
]Seaser_Data/Enkelseeder.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 " }
}
}
]Langsam eins von einem Sämaschine
Beachten Sie, dass die Titel im csv-file mit den Feldnamen im serializer übereinstimmen müssen
Dieser Sämaschine wird verwendet, um einen Serializer zu injizieren, um benutzerdefinierte Erstellung der Logik zu implementieren
Models.py
class M3(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Serializer.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)
Säder.py
@SeederRegistry.register
class M3Seeder(seeders.CSVFileSerializerSeeder):
id = 'M3Seeder'
priority = 3
serializer_class = M3Serializer
csv_file_path = 'django_seeding_example/seeders_data/M3Seeder.csv'
Seasers_Data/M3Seeder.csv
title,description
t1,d1
t2,d2
Langsam eins von einem Sämaschine
Beachten Sie, dass die Schlüssel im json-file mit den Feldnamen im serializer übereinstimmen müssen
Dieser Sämaschine wird verwendet, um einen Serializer zu injizieren, um benutzerdefinierte Erstellung der Logik zu implementieren
Models.py
class M4(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Serializer.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)
Säder.py
@SeederRegistry.register
class M4Seeder(seeders.JSONFileSerializerSeeder):
id = 'M4Seeder'
priority = 4
serializer_class = M4Serializer
json_file_path = 'django_seeding_example/seeders_data/M4Seeder.json'
Seaser_Data/M4Seeder.json
[
{
"title": "json t1",
"description": "json d1"
},
{
"title": "json t2",
"description": "json d2"
}
]
Schneller bulk_create Sämamer
Models.py
class M5(models.Model):
title = models.CharField(max_length=100, null=True)
description = models.TextField(null=True)
Säder.py
@SeederRegistry.register
class M5Seeder(seeders.EmptySeeder):
id = 'M5Seeder'
priority = 5
model = M5
records_count = 2
Schneller bulk_create Sämamer
Beachten Sie, dass die Schlüssel in der data -Attribute mit den Feldnamen im model übereinstimmen müssen
Models.py
class M6(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Säder.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"
},
]
Langsam eins von einem Sämaschine
Beachten Sie, dass die Schlüssel in der data -Attribute mit den Feldnamen im serializer übereinstimmen müssen
Dieser Sämaschine wird verwendet, um einen Serializer zu injizieren, um benutzerdefinierte Erstellung der Logik zu implementieren
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)
Säder.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"
},
]
Hier können Sie Ihre Logik schreiben, wie Sie es möchten, in der Saatgutmethode
Models.py
class Post(models.Model):
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.TextField()
Säder.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')
Wenn Sie Vorschläge für die Verbesserung von Django -Aussaat haben oder einen Fehler melden möchten, öffnen Sie ein Problem! Wir würden alle und alle Beiträge lieben.
Weitere Informationen finden Sie im beitragenden Leitfaden.
Suliman awad - [email protected] - linkedIn
Projektlink: https://github.com/suliman-99/django-seeding
MIT -Lizenz
Copyright (C) 2023 Suliman Awad
Weitere Informationen finden Sie in der Lizenzdatei.