Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Modèle avec relations
Les modèles Django peuvent avoir des relations entre eux, exactement comme les tables dans une base de données relationnelle.
Les trois types de relations :
ForeignKey (un-vers-plusieurs) : un article a UN auteur, mais un auteur peut avoir PLUSIEURS articles.
class Article(models.Model): auteur = models.ForeignKey('Auteur', on_delete=models.CASCADE)
on_delete definit ce qui se passe quand l'objet référence est supprime : - CASCADE : supprime aussi les objets lies - SET_NULL : met la référence a null (necessite null=True) - PROTECT : empeche la suppression
ManyToManyField (plusieurs-vers-plusieurs) : un article peut avoir PLUSIEURS tags, et un tag peut etre sur PLUSIEURS articles.
class Article(models.Model): tags = models.ManyToManyField('Tag')
Definis trois modèles :
1. Author : name (CharField max 100), bio (TextField, blank=True) 2. Category : name (CharField max 50), slug (SlugField unique) 3. BlogPost : title (CharField max 200), content (TextField), author (ForeignKey vers Author, CASCADE), category (ForeignKey vers Category, SET_NULL, null=True, blank=True), tags (CharField max 200, blank=True, pour simplifier), is_published (BooleanField default False)
Chaque modèle a Meta avec app_label = 'test' et une méthode __str__ qui retourne le name ou le title.
field = Author._meta.get_field('name')
assert field.max_length == 100
Category a un slug unique
field = Category._meta.get_field('slug')
assert field.unique == True
BlogPost ForeignKey Author
field = BlogPost._meta.get_field('author')
assert field.related_model == Author
BlogPost category SET_NULL
from django.db import models as m
field = BlogPost._meta.get_field('category')
assert field.remote_field.on_delete == m.SET_NULL and field.null == 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 Author(models.Model):
name = models.CharField(max_length=100)
bio = models.TextField(blank=True)
class Meta:
app_label = 'test'
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(unique=True)
class Meta:
app_label = 'test'
def __str__(self):
return self.name
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True)
tags = models.CharField(max_length=200, blank=True)
is_published = models.BooleanField(default=False)
class Meta:
app_label = 'test'
def __str__(self):
return self.title