[PYTHON] Comment vérifier le comportement d'ORM avec un fichier avec django

Comment vérifier le comportement d'ORM avec un fichier avec django

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

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.

Enregistrer le modèle dans le registre des applications de django

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__

Générer un tableau pour chaque modèle

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)

Résumé

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

Comment vérifier le comportement d'ORM avec un fichier avec django
Comment faire du zéro-padding sur une ligne avec OpenCV
Comment vous permettre d'essayer les fonctionnalités du framework django rest dans un seul fichier
Comment déposer Google Docs dans un dossier dans un fichier .txt avec python
Comment utiliser ORM / Query Builder Orator de type Laravel avec Django
[Django] Comment donner des valeurs d'entrée à l'avance avec ModelForm
Comment convertir 0,5 en 1056964608 en un seul coup
Comment refléter CSS dans Django
Comment démarrer avec Django
[Django] Comment lire les variables / constantes définies dans un fichier externe
Comment afficher les marques de légende en un avec le tracé Python 2D
Comment calculer "xx time" en un seul coup avec Python Timedelta
Comment effectuer un traitement arithmétique avec le modèle Django
Comment supprimer des sessions expirées dans Django
Comment utiliser BigQuery en Python
Comment vérifier la version d'opencv avec python
Comment faire des événements envoyés par le serveur dans Django
Comment gérer les caractères déformés dans json de Django REST Framework
Comment gérer les fuites de mémoire dans matplotlib.pyplot
Comment lire un fichier CSV avec Python 2/3
[REAPER] Comment jouer à Reascript avec Python
Comment implémenter la fonctionnalité de type helper Rails dans Django
Enregistrez plusieurs modèles sous un seul formulaire avec Django
Comment développer une application de panier avec Django
Comment créer un fichier JSON en Python
[Python] Comment lire des fichiers Excel avec des pandas
Comment refléter ImageField dans Django + Docker (oreiller)
Comment gérer les erreurs d'exécution dans subprocess.call
Comment implémenter "named_scope" de RubyOnRails avec Django
Comment vérifier / extraire des fichiers dans un package RPM
Comment utiliser tkinter avec python dans pyenv
Comment créer une API Rest dans Django
Comment lire des fichiers dans différents répertoires
Exemple pour mettre Python Kivy dans un fichier
Téléchargement de fichiers avec django
Comment convertir / restaurer une chaîne avec [] en python
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment faire un calcul de hachage avec Salt en Python
Comment définir Decorator et Decomaker avec une seule fonction
Expliquez en détail comment créer un son avec python
Comment gérer l'échec de l'initialisation pyenv dans Fish 3.1.0
Comment exécuter des tests avec Python unittest
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment mesurer le temps de lecture d'un fichier mp3 avec python
Comment accéder avec cache lors de la lecture_json avec pandas
Comment utiliser le bootstrap dans la vue de classe générique Django
Comment convertir un fichier JSON en fichier CSV avec Python Pandas
Comment utiliser le moteur de modèle dans une application de fichier de Pyramid
Comment télécharger des fichiers dans la vue de classe générique Django
[Efficacité du travail] Comment changer les noms de fichiers par lots avec Python
Comment utiliser Decorator dans Django et comment le créer
Comment référencer des fichiers statiques dans un projet Django
Comment gérer l'exécution de la transaction: échec dans Anaconda
Comment utiliser fixture dans Django pour saisir des exemples de données associés au modèle utilisateur
Comment démarrer du code écrit en Atom avec une seule commande sans démarrer Teminal
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Comment écrire une validation personnalisée dans Django REST Framework