J'ai écrit Comment faire bonjour le monde avec un seul fichier avant. La chose que vous voulez le plus essayer avec django peut être la partie ORM. Comment essayer la partie ORM avec un seul fichier.
Il faut un peu de travail pour l'essayer avec un seul fichier, mais le récent django l'a rendu raisonnablement facile.
Plus précisément, les travaux suivants sont nécessaires.
--Définir les paramètres du côté python
S'il n'y a pas de paramètres, l'exception suivante se produira.
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.
Selon le message d'erreur, enregistrez DJANGO_SETTINGS_MODULE
comme variable d'environnement ou appelez settings.configure ()
.
Les paramètres minimum requis sont les suivants.
from django.conf import settings
settings.configure(
DEBUG=True,
DATABASES={"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:"
}},
INSTALLED_APPS=[__name__]
)
DEBUG = True
est nécessaire lors de la sortie du résultat de la requête de sql, il est donc préférable de l'ajouter. De plus, les paramètres de base de données sont requis. Ici, la base de données en mémoire de sqlite est spécifiée. Pour ʻINSTALLED_APPS, si vous oubliez de le spécifier lors de l'enregistrement du modèle décrit plus tard, la relation de
ManyToMany` ne fonctionnera pas correctement.
Appelez django.setup ()
. Cela appellera populate ()
dans django.apps.registry.Apps
. En cela, le modèle sera enregistré dans le registre de django. Si cela n'est pas fait, l'erreur suivante se produira au moment où Model.save ()
est appelé.
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Notez également que définissez ʻapp_label` sur le modèle à définir. Sans cela, la classe de modèle ne peut pas être générée. J'obtiens l'erreur suivante.
IndexError: list index out of range
Lors de sa définition, procédez comme suit.
class X(models.Model):
name = models.CharField(max_length=255, default="foo", blank=True)
class Meta:
app_label = __name__
Normalement, une table DB est générée par python manage.py migrate
etc. Il n'y a pas de procédure pour un fichier. Vous devez penser à d'autres moyens.
Par exemple, créons une fonction qui crée une table.
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)
#Il est nécessaire de générer un par un
create_table(X)
Ce qui précède peut être résumé comme suit. Avec cela, vous pouvez facilement vérifier le comportement du modèle.
# -*- 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