Je suis un débutant dans Django et je veux créer un système dans les modèles Django où un utilisateur peut télécharger un cours avec un titre et différents chapitres qui peuvent tous contenir plusieurs vidéos. Comme le montre cette image.

J'ai pensé à créer trois modèles

1. Cours

avec le titre du cours

2. Chapitre

qui contient différentes vidéos

3. Vidéo

Et voici la vidéo avec un titre de la vidéo

Mais je n'ai aucune idée de comment créer une connexion entre ces trois modèles, de sorte qu'il puisse y avoir plusieurs chapitres dans un cours et plusieurs vidéos dans un chapitre.

Ce sont mes premiers modèles (je viens de les créer rapidement):

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)


class video(models.Model):
    title = models.CharField(max_length=100)
    video = models.FileField(upload_to=user_directory_path)

class course(models.Model):
    title = models.CharField(max_length=100)

class chapter(models.Model):
    pass

Comment dois-je ajuster les modèles et créer la connexion pour réaliser le système que je recherche?

1
JonasLevin 2 sept. 2020 à 20:58

2 réponses

Meilleure réponse

Vous pouvez utiliser les modèles ci-dessous comme base. En règle générale, ForeignKey crée une relation plusieurs-à-un (un utilisateur peut posséder plusieurs cours, mais un cours ne peut pas appartenir à plusieurs utilisateurs). Et ManyToManyField crée une relation plusieurs-à-plusieurs (un étudiant peut être inscrit à plusieurs cours, et un cours peut également avoir plusieurs étudiants inscrits). Notez que l'attribut related_name est la façon dont vous faites référence aux instances (de la classe contenant le champ relationnel) lorsque vous y accédez à partir de l'objet associé vers lequel pointe la classe (exemples: https://docs.djangoproject.com/en/3.1/topics/db/queries/#backwards-related- objets).

from django.contrib.auth.models import User
from django.db import models

    
class Subject(models.Model):
    title = models.CharField(max_length=200)
    
class Course(models.Model):
    owner = models.ForeignKey(User, related_name='courses_created', on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, related_name='courses', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    created = models.DateTimeField(auto_now_add=True)
    students = models.ManyToManyField(User, related_name='courses_joined', blank=True)

class Chapter(models.Model):
    course = models.ForeignKey(Course, related_name='chapters', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    
class VideoItem(models.Model):
    title = models.CharField(max_length=250)
    video = models.FileField(upload_to=user_directory_path)
    chapter = models.ForeignKey(Chapter, related_name='videos', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
1
progdev 4 sept. 2020 à 12:07

Voici un brouillon de ce que vous pouvez faire:
Notez que les noms de classes sont en CamelCase **

class Course(models.Model):
    title = models.CharField(max_length=100)

class Chapter(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)

class Video(models.Model):
    title = models.CharField(max_length=100)
    video = models.FileField(upload_to=user_directory_path)
    chapter = models.ForeignKey('Chapter', on_delete=models.CASCADE)
0
Nadhem Maaloul 2 sept. 2020 à 18:05