Table des matières

Base de données

Django prend officiellement en charge les bases de données suivantes :

Documentation

Configuration

Par défaut, c'est sqlite qui est configuré dans le fichier settings.py

Nous utiliserons cette base pour le cours

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

INSTALLED_APPS

Afin d'utiliser toutes les fonctionnalités liées aux bases de données, il faut que l'application soit inscrite dans la liste INSTALLED_APPS du fichier settings.py du projet. N’oubliez pas d’ajouter vos applications dans cette liste.

Création des tables de bases de données

3 étapes :

Créer un modèle

Documentation

Exemple d'un modèle pour des articles de blogue

Fichier blogue/models.py

from django.db import models

# Create your models here.
class Article(models.Model):
  title = models.CharField(max_length=255)
  content = models.TextField(blank=True)
  is_draft = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)

Création d'une classe qui hérite de models.Model. Cette classe définit une table de la base de données

Définition des champs de la table avec le type et les options.

Créer une migration

documentation

Les fichiers migrations permettent d'enregistrer les caractéristiques des tables de notre base de données. Ils définissent le “plan des tables”.

Nous devons donc créer une migration chaque fois que nous apportons un changement à nos modèles.

Ces migrations sont stockées dans le dossier migrations de chaque application

exemple: blogue/migrations

Pour créer les fichiers de migration, exécuter par exemple :

$ python manage.py makemigrations 

# ou pour une application en particulier
$ python manage.py makemigrations blogue

(Voir le dossier migrations pour avoir un aperçu des fichiers créer par la migration)

Exécuter la migration

$ python manage.py migrate

# ou pour une application en particulier
$ python manage.py migrate blogue

Cela va créer la ou les tables dans la base de données

Vérifier votre base de données afin de contrôler que la table a été créée correctement.

Si besoin, on peut afficher le code SQL correspondant à une migration. Exemple pour la migration 0001 de la table blogue

python .\manage.py sqlmigrate blogue 0001

Inversion des migrations

Les migrations peuvent être inversées avec migrate en passant le numéro de la migration précédente. Par exemple, pour inverser la migration blogue.0002

$ python manage.py migrate blogue 0002

Pour défaire toutes les migrations appliquées d’une application, utilisez le terme zero

$ python manage.py migrate blogue zero

Relations

Relations plusieurs-à-un

Documentation

Exemple: un article peut avoir une catégorie et une catégorie peut appartenir à plusieurs articles

Mise en place d'une clé étrangère dans la table article.

class Category(models.Model):
  title = models.CharField(max_length=255)
  description = models.TextField(blank=True)

class Article(models.Model):
  title = models.CharField(max_length=255)
  content = models.TextField(blank=True)
  is_draft = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)
  category = models.ForeignKey(Category, on_delete=models.CASCADE)

Documentation de ForeignKey

Relations plusieurs-à-plusieurs

documentation

Exemple: un article peut avoir plusieurs catégories et une catégorie peut appartenir à plusieurs articles.

Mise en place d'une table de jointure article_categories.

class Category(models.Model):
  title = models.CharField(max_length=255)
  description = models.TextField(blank=True)

class Article(models.Model):
  title = models.CharField(max_length=255)
  content = models.TextField(blank=True)
  is_draft = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)
  categories = models.ManyToManyField(Category)

On peut voir que la table blogue_article_categories a été créée.

Sauvegarde de la BD dans un fichier

documentation

# Enregistre dans un fichier json
python .\manage.py dumpdata -o mydata.json

# Enregistre dans un fichier json au format compressé
python .\manage.py dumpdata -o mydata.json.gz

Charger les données dans la BD à partir d'un fichier de sauvegarde

documentation

python .\manage.py loaddata mydata.json

Exercice