【问题标题】:How can I connect multiple models in Django如何在 Django 中连接多个模型
【发布时间】:2020-09-02 17:58:14
【问题描述】:

我是 Django 的初学者,想在 Django 模型中创建一个系统,用户可以上传带有标题和不同章节的课程,这些章节中都可以包含多个视频。 如image 所示。

我想过创建三个模型

1.课程

带有课程名称

2。章节

里面有不同的视频

3。视频

这里是带有视频标题的视频

但我不知道如何在这三个模型之间建立联系,以便一门课程中有多个章节,一章中有多个视频。

这些是我的第一个模型(我只是快速创建它们):

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

我应该如何调整模型并创建连接以完成我所追求的系统?

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    您可以使用以下模型作为基础。一般ForeignKey创建多对一关系(一个用户可以拥有多门课程,但一门课程不能由多个用户拥有)。而ManyToManyField 则创建了多对多的关系(一个学生可以注册多门课程,一个课程也可以有多个学生注册)。请注意,related_name 属性是您在从类指向的相关对象(例如:https://docs.djangoproject.com/en/3.1/topics/db/queries/#backwards-related-objects)访问实例(包含关系字段的类的)时引用它们的方式。

    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)
    

    【讨论】:

      【解决方案2】:

      以下是关于您可以做什么的草稿:
      请注意,类名采用 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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 2019-07-24
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多