Ich habe vorher Wie man mit einer Datei Hallo Welt macht geschrieben. Das, was Sie am meisten mit Django ausprobieren möchten, ist möglicherweise der ORM-Teil. So versuchen Sie den ORM-Teil mit nur einer Datei.
Es erfordert ein wenig Arbeit, es mit einer Datei zu versuchen, aber der jüngste Django hat es einigermaßen einfach gemacht.
Insbesondere sind die folgenden Arbeiten erforderlich.
Wenn keine Einstellungen vorhanden sind, tritt die folgende Ausnahme auf.
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Registrieren Sie gemäß der Fehlermeldung "DJANGO_SETTINGS_MODULE" als Umgebungsvariable oder rufen Sie "settings.configure ()" auf. Die minimal erforderlichen Einstellungen sind wie folgt.
from django.conf import settings
settings.configure(
DEBUG=True,
DATABASES={"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:"
}},
INSTALLED_APPS=[__name__]
)
DEBUG = True
ist erforderlich, wenn das Abfrageergebnis von SQL ausgegeben wird. Es ist daher besser, es hinzuzufügen. Zusätzlich sind DB-Einstellungen erforderlich. Hier wird die speicherinterne Datenbank von SQLite angegeben. Wenn Sie in Bezug auf "INSTALLED_APPS" vergessen, es bei der Registrierung des später beschriebenen Modells anzugeben, funktioniert die Beziehung von "ManyToMany" nicht ordnungsgemäß.
Rufen Sie django.setup ()
auf. Dies ruft "populate ()" in "django.apps.registry.Apps" auf. Dabei wird das Modell in die Registrierung von Django eingetragen. Wenn dies nicht getan wird, tritt der folgende Fehler zum Zeitpunkt des Aufrufs von "Model.save ()" auf.
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Setzen Sie als Einschränkung "app_label" auf das zu definierende Modell. Ohne dies kann die Modellklasse nicht generiert werden. Ich erhalte den folgenden Fehler.
IndexError: list index out of range
Gehen Sie beim Definieren wie folgt vor.
class X(models.Model):
name = models.CharField(max_length=255, default="foo", blank=True)
class Meta:
app_label = __name__
Normalerweise wird eine DB-Tabelle durch "python manage.py migrate" usw. generiert. Es gibt keine Prozedur für eine Datei. Sie müssen über andere Wege nachdenken. Erstellen wir beispielsweise eine Funktion, die eine Tabelle erstellt.
from django.db import connections
from django.core.management.color import no_style
def create_table(model):
connection = connections['default']
cursor = connection.cursor()
sql, references = connection.creation.sql_create_model(model, no_style())
for statement in sql:
cursor.execute(statement)
for f in model._meta.many_to_many:
create_table(f.rel.through)
#Es ist notwendig, eins nach dem anderen zu generieren
create_table(X)
Das Obige kann wie folgt zusammengefasst werden. Mit dieser Funktion können Sie das Verhalten des Modells leicht überprüfen.
# -*- coding:utf-8 -*-
import django
from django.db import models
from django.conf import settings
from django.db import connections
from django.core.management.color import no_style
settings.configure(
DEBUG=True,
DATABASES={"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:"
}},
INSTALLED_APPS=[__name__]
)
def create_table(model):
connection = connections['default']
cursor = connection.cursor()
sql, references = connection.creation.sql_create_model(model, no_style())
for statement in sql:
cursor.execute(statement)
for f in model._meta.many_to_many:
create_table(f.rel.through)
class X(models.Model):
name = models.CharField(max_length=255, default="foo", blank=True)
class Meta:
app_label = __name__
if __name__ == "__main__":
import logging
logging.basicConfig(level=logging.DEBUG)
django.setup()
create_table(X)
xs = X.objects.bulk_create([X(id=1), X(id=2), X(id=3)])
print(X.objects.count())
Recommended Posts