Table des matières

ORM

documentation

ORM ⇒ Object Relational Mapping.

C'est une technique de programmation qui permet de manipuler les données de la base de données comme des objets.

Créer un objet à partir d'un modèle

Utilisation du shell afin de faire quelques tests.

$ python manage.py shell

Création d'un article de blogue

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
>>> from blogue.models import *
>>> a = Article()
>>> a.title = "un article"
>>> a.content = "texte de mon article"
>>> a.save()

On peut également écrire de cette façon :

>>> b = Article(title = "2eme article", content = "texte de l'article").save()

Avec une clé étrangère category par exemple :

>>> cat = Category(title="Les chiens")
>>> cat.save()
>>> art = Article(title = "article sur les chiens", content = "texte de l'article") 
>>> art.category = cat
>>> art.save()

Liaison plusieurs à plusieurs

>>> cat1 = Category(title="Les chiens")
>>> cat1.save()
>>> cat2 = Category(title="Les chats")
>>> cat2.save()
>>> art = Article(title = "article sur les chiens et les chats", content = "texte de l'article") 
>>> art.save()
>>> art.categories.add(cat1, cat2)
>>> art.save()

Objects, le manager des modèles

Récupération des enregistrements de la base de données (sous forme d'objet) via le manager que tout modèle possède et qui s'appelle objects.

Afficher toutes les entrées d'un modèle

>>> Article.objects.all() 
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>

Récupérer un objet

>>> Article.objects.get(id=1)      
<Article: Article object (1)>
>>> Article.objects.get(id=1).title    
'Un super article'

Si la méthode __str__() est défini dans le modèle, l'affichage correspond au return de la méthode

>>> Category.objects.get(id=1)        
<Category: Animaux => Les animaux>

La méthode filter()

La méthode get ne retourne qu'un seul objet, filter permet de récupérer plusieurs enregistrement.

>>> Article.objects.filter(is_draft=0)
<QuerySet [<Article: Article object (2)>, <Article: Article object (3)>]>

On peut également enchaîner les filtres

>>> Article.objects.filter(is_draft=0).exclude(id=2)
<QuerySet [<Article: Article object (3)>]>

delete()

>>> art = Article.objects.get(id=6) 
>>> art.delete()
(1, {'blogue.Article': 1})

Exercice

Reprendre le projet blogue et modifier le fichier view.py afin d'afficher la liste des articles sur la page /blogue

Faire également la page blogue/article/<id>