Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Definir un modèle Article
Un modèle Django est une classe Python qui représente une table dans la base de données. Chaque attribut du modèle correspond a une colonne de la table. Django s'occupe de tout le SQL : création de table, insertion, mise a jour, suppression.
Pour definir un modèle, tu créés une classe qui herite de django.db.models.Model :
from django.db import models
class Personne(models.Model): nom = models.CharField(max_length=100) age = models.IntegerField(default=0) email = models.EmailField(unique=True)
class Meta: app_label = 'test'
Les types de champs courants : - CharField(max_length=N) : texte court (jusqu'a N caracteres) - TextField() : texte long (sans limite) - IntegerField() : nombre entier - FloatField() : nombre decimal - BooleanField(default=False) : vrai/faux - DateTimeField(auto_now_add=True) : date/heure, automatiquement rempli a la création - EmailField() : comme CharField mais avec validation email - SlugField() : texte URL-friendly (lettres, chiffres, tirets)
La classe Meta interne permet de configurer le modèle. Pour nos exercices, on a toujours besoin de app_label = 'test' car on ne fait pas partie d'une vraie app Django.
Definis un modèle Article avec les champs : - title : CharField, max 200 caracteres - content : TextField - author_name : CharField, max 100 caracteres - is_published : BooleanField, défaut False - created_at : DateTimeField, auto_now_add=True - slug : SlugField, unique=True
Ajoute aussi une méthode __str__ qui retourne le titre de l'article.
Ajoute dans Meta : app_label = 'test' et ordering = ['-created_at']
Exemple :
fields = [f.name for f in Article._meta.get_fields()] 'title' in fields vaut True Article._meta.ordering vaut ['-created_at']
Tests (4/5)
Champ title existe
fields = {f.name: f for f in Article._meta.get_fields()}
assert 'title' in fields
Champ content est TextField
field = Article._meta.get_field('content')
assert field.__class__.__name__ == 'TextField'
is_published default False
field = Article._meta.get_field('is_published')
assert field.default == False
slug est unique
field = Article._meta.get_field('slug')
assert field.unique == True
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import django
from django.conf import settings
if not settings.configured:
settings.configure(
DATABASES={},
INSTALLED_APPS=['django.contrib.contenttypes'],
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
)
django.setup()
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author_name = models.CharField(max_length=100)
is_published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
slug = models.SlugField(unique=True)
class Meta:
app_label = 'test'
ordering = ['-created_at']
def __str__(self):
return self.title