【问题标题】: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)