Modèles Django

Django offre un excellent support pour diverses bases de données, notamment : PostgreSQL, MySQL, SQLite, Oracle.

Django fournit une API d'appel unifiée pour ces bases de données. Nous pouvons choisir différentes bases de données selon nos besoins métier.

MySQL est la base de données la plus couramment utilisée dans les applications web. Dans ce chapitre, nous utiliserons MySQL comme exemple pour la démonstration. Vous pouvez utiliser leTutoriel MySQLde ce site pour en savoir plus sur les bases de MySQL.

Si vous n'avez pas installé le pilote mysql, vous pouvez exécuter la commande suivante pour l'installer :

sudo pip3 install pymysql

ORM Django

Les modèles Django utilisent l'ORM intégré.

Le mappage objet-relationnel (ORM en abrégé) est utilisé pour mettre en œuvre la conversion entre les données de différents types de systèmes dans les langages de programmation orientés objet.

L'ORM agit comme un pont entre la couche de logique métier et la couche de base de données.

L'ORM persiste automatiquement les objets d'un programme dans la base de données en utilisant des métadonnées qui décrivent le mappage entre les objets et la base de données.

Avantages de l'utilisation d'ORM :

  • Améliorer l'efficacité de développement.
  • Différentes bases de données peuvent être changées en douceur.

Inconvénients de l'utilisation d'ORM :

  • Lorsque le code ORM est converti en instructions SQL, cela prend un certain temps, et l'efficacité d'exécution sera réduite.
  • Écrire du code ORM pendant longtemps réduira la capacité à écrire des instructions SQL.

Processus d'analyse d'ORM :

  • 1. L'ORM convertit le code Python en instructions SQL.
  • 2. L'instruction SQL est transmise au serveur de base de données via pymysql.
  • 3. Exécuter l'instruction SQL dans la base de données et renvoyer le résultat.

Table de mappage ORM :


Configuration de la base de données

Comment Django utilise la base de données MySQL

Syntaxe de création d'une base de données MySQL (l'ORM ne peut pas opérer au niveau de la base de données, il peut uniquement opérer sur les tables de données) :

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

Par exemple, nous créons une base de données nommée example et spécifions l'encodage comme utf8 :

create database example default charset=utf8;   

Dans le fichier settings.py du projet, trouvez l'élément de configuration DATABASES et modifiez ses informations comme suit :

HelloWorld/HelloWorld/settings.py : code du fichier :

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Moteur de base de données 'NAME': 'example', # Nom de la base de données 'HOST': '127.0.0.1', # Adresse de la base de données, adresse IP de la machine locale 127.0.0.1 'PORT': 3306, # Port 'USER': 'root', # Nom d'utilisateur de la base de données 'PASSWORD': '123456', # Mot de passe de la base de données } }

Si vous utilisez Python2.x, des commentaires en chinois sont ajoutés ici, donc vous devez ajouter ce qui suit au début du fichier HelloWorld/settings.py :# -*- coding: UTF-8 -*-。

Ce qui précède contient le nom de la base de données et les informations d'utilisateur, qui sont identiques aux paramètres correspondants de base de données et d'utilisateur dans MySQL. Django se connecte à la base de données et à l'utilisateur correspondants dans MySQL selon ce paramètre.

Ensuite, indiquez à Django d'utiliser le module pymysql pour se connecter à la base de données mysql :

Exemple

# Importer les modules et configurer dans __init__.py dans le même répertoire que settings.py
import pymysql
pymysql.install_as_MySQLdb()

Définir le modèle

Créer une application

Django stipule que si vous souhaitez utiliser des modèles, vous devez créer une application. Nous utilisons la commande suivante pour créer une application appelée TestModel :

django-admin startapp TestModel

La structure du répertoire est la suivante :

HelloWorld
|-- HelloWorld
|-- manage.py
...
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py

Nous modifions le fichier TestModel/models.py, le code est le suivant :

HelloWorld/TestModel/models.py : Code du fichier :

# models.py from django.db import models class Test(models.Model): name = models.CharField(max_length=20)

Le nom de la classe ci-dessus représente le nom de la table de base de données, et la classe hérite de models.Model. Les champs à l'intérieur de la classe représentent les champs (name) dans la table de données, et les types de données sont déterminés par CharField (équivalent à varchar), DateField (équivalent à datetime). Le paramètre max_length limite la longueur.

Ensuite, trouvez l'entrée INSTALLED_APPS dans settings.py, comme suit :

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',               # 添加此项
)

Exécutez dans la ligne de commande :

$ python3 manage.py migrate   # 创建表结构

$ python3 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate TestModel   # 创建表结构

Lorsque vous voyez les mots « Creating table... » sur quelques lignes, votre table de données a été créée.

Creating tables ...
……
Creating table TestModel_test  #我们自定义的表
……

La structure du nom de table est : nom_application_nom_classe (par exemple, TestModel_test).

Remarque :Bien que nous n'ayons pas défini de clé primaire pour la table dans models, Django ajoutera automatiquement un id comme clé primaire.

Messages d'erreur courants

Si le message d'erreur suivant apparaît lors de l'exécution de la commande ci-dessus :

La raison est que MySQLclient ne prend actuellement en charge que Python 3.4, donc si vous utilisez une version plus récente de Python, vous devez modifier comme suit :

À l'aide du chemin de fichier dans le message d'erreur, trouvez le fichier base.py dans le chemin ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql, et commentez ces deux lignes de code (le code se trouve au début du fichier) :

if version < (1, 3, 13):
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

Généralement, cliquez sur les informations de chemin du fichier de code dans l'erreur, et cela passera automatiquement au numéro de ligne dans le fichier d'erreur. À ce stade, nous commentons la ligne de code qui a signalé l'erreur.

Si le message d'erreur suivant apparaît :

Nous cliquons sur le chemin du fichier de code de l'erreur, accédons au numéro de ligne dans le fichier d'erreur, et à ce stade nous ajoutons ce qui suit avant la ligne de code en erreur :

query = query.encode()


Opération de base de données

Ensuite, nous ajoutons le fichier testdb.py (décrit ci-dessous) dans le répertoire HelloWorld, et modifions urls.py :

HelloWorld/HelloWorld/urls.py : code du fichier :

from django.urls import path from . import views,testdb urlpatterns = [ path('example/', views.example), path('testdb/', testdb.testdb), ]

Ajouter des données

Pour ajouter des données, vous devez d'abord créer un objet, puis exécuter la fonction save, ce qui équivaut à INSERT en SQL :

HelloWorld/HelloWorld/testdb.py : code du fichier :

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Opération de base de données def testdb(request): test1 = Test(name='example') test1.save() return HttpResponse("<p>Données ajoutées avec succès !</p>")

Visitezhttp://127.0.0.1:8000/testdbEnsuite, vous pouvez voir un message indiquant que les données ont été ajoutées avec succès.

Le résultat de sortie est le suivant :

Obtenir les données

Django propose plusieurs façons de récupérer le contenu de la base de données, comme le montre le code suivant :

HelloWorld/HelloWorld/testdb.py : code du fichier :

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Opération de base de données def testdb(request): # Initialiser response = "" response1 = "" # Utilisez la méthode all() du gestionnaire de modèle objects pour obtenir toutes les lignes de données, équivalent à SELECT * FROM en SQL. listTest = Test.objects.all() # filter est équivalent à WHERE en SQL, permet de définir des conditions pour filtrer les résultats response2 = Test.objects.filter(id=1) # Obtenir un seul objet response3 = Test.objects.get(id=1) # Limiter les données renvoyées, équivalent à OFFSET 0 LIMIT 2 en SQL ; Test.objects.order_by('name')[0:2] #Tri des données Test.objects.order_by("id") # Les méthodes ci-dessus peuvent être chaînées Test.objects.filter(name="example").order_by("id") # Afficher toutes les données for var in listTest: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")

Mettre à jour les données

Pour modifier les données, vous pouvez utiliser save() ou update() :

HelloWorld/HelloWorld/testdb.py : code du fichier :

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Opération de base de données def testdb(request): # Modifier le champ name de l'objet avec id=1, puis save, équivalent à UPDATE en SQL test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # Une autre méthode #Test.objects.filter(id=1).update(name='Google') # Modifier toutes les colonnes # Test.objects.all().update(name='Google') return HttpResponse("<p>Modifié avec succès</p>")

Supprimer des données

Pour supprimer un objet dans la base de données, il vous suffit d'appeler la méthode delete() de cet objet :

HelloWorld/HelloWorld/testdb.py : code du fichier :

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Opération de base de données def testdb(request): # Supprimer les données avec id=1 test1 = Test.objects.get(id=1) test1.delete() # Une autre méthode # Test.objects.filter(id=1).delete() # Supprimer toutes les données # Test.objects.all().delete() return HttpResponse("<p>Supprimé avec succès</p>")
autres extensions