Django : Les Modèles

Mvogo

24 May 2022

 

Quand on est développeur back-end Django, le ou les modèles sont les sujets les plus importants à aborder. Ils définissent en quelque sorte la strusture d'une base de données.

Je vous invite à regarder fortement la documentation de Django vis à vis de cela : https://docs.djangoproject.com/fr/4.0/topics/db/models/

Comme vous pouvez le voir on peut définir le type de données. Dans cet exemple, on utilise Charfield, TextField et ImageField.
Ils existent aussi IntergerField pour ceux qui veulent utliser des entiers.

 

class Site(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    logo = models.ImageField(upload_to='logo/')   

    def __str__(self):
        return self.name

 

La méthode __str__    donne une représentation en chaîne de caractères lisible de l'objet en question. Au niveau de Django, cela renverra un titre ou un nom au modèle dans la partie administration.

 

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    description = models.TextField()    class Meta:
        verbose_name_plural = "categories"
  
    def __str__(self):
        return self.name

 

 

 

class Tag(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    description = models.TextField()  

    def __str__(self):
        return self.name

 

 

 

from ckeditor.fields import RichTextField

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    content = RichTextField()
    featured_image = models.ImageField(upload_to='images/')
    is_published = models.BooleanField(default=False)
    is_featured = models.BooleanField(default=False)
    created_at = models.DateField(auto_now=True)   

    def __str__(self):
        return self.title

 

 

category = models.ForeignKey(Category, on_delete=models.CASCADE)
tag = models.ManyToManyField(Tag)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

 

Après avoir défini le modèle, on fait les migrations:

python manage.py makemigrations
python manage.py migrate

 

Création de l'administrateur du site:

python manage.py createsuperuser

 

Pour faire apparaître les models dans la partie administration, on utulise le fichier admin.py:

from django.contrib import admin# Register your models here.

from .models import Site, Category, Tag, Post

class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name",)}

class TagAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name",)}

class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Site)
admin.site.register(Category, CategoryAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Post, PostAdmin)

 

PS : Il vous arrivera de voir peut être des Meta Class  dans les modèles. Elles vous permettent de modifier les attributs ou les champs du modèle.

 

class student(models.Model):
    class Meta:
        options........

 

 

Relation N - N

 

Dans cet exemple, chaque article peut avoir plusieurs balises, et chaque balise peut avoir plusieurs articles.

 

class Tag(models.Model):
    name = models.CharField(max_length=100)
class Article(models.Model):
    tags = models.ManyToManyField('Tag')

 

ForeignKey créera une category_id colonne dans la table des publications qui stocke idla catégorie à laquelle appartient cette publication.

 

Relation 1 - N

 

Pour cette exemple, chaque catégorie peut avoir plusieurs publications et chaque publication appartient  à une catégorie.

 

class Category(models.Model):
    name = models.CharField(max_length=100)
class Post(models.Model):
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

 

Au lieu de créer une nouvelle colonne, ce code créera une nouvelle table appelée article_tags, qui contient deux colonnes, article_id et tag_id. Cela vous permet de localiser toutes les balises associées à un article particulier, et vice versa.