多个其他表的外键
Foreign key to multiple other tables
我正在开发一个内容管理系统,用户可以在其中创建课程供学生学习。
到目前为止,我的数据库有课程、课程和幻灯片模型,我想将我的幻灯片模型连接到测验、HTML 或视频:
class Course(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
slug = models.SlugField(max_length=40, unique=True)
name = models.CharField(max_length=100)
desc = models.CharField(max_length=1000)
date_created = models.DateTimeField(default=datetime.now, blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
price = models.DecimalField(max_digits=8, decimal_places=2)
is_visible = models.BooleanField(default=True)
def __str__ (self):
return self.name
class Lesson(models.Model):
course = models.ForeignKey(Course, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
order = models.IntegerField()
def __str__ (self):
return self.name
class Quiz(models.Model):
points = models.IntegerField()
# Link to quiz model
class HTML(models.Model):
content = models.TextField(blank=True)
class Video(models.Model):
media_path = models.CharField(max_length=150)
class Slide(models.Model):
lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
slide_type = models.CharField(max_length=100, choices=[("video", "Video"),("image", "Image"), ("text", "Text"), ("quiz", "Quiz")])
notes = models.TextField(blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
content = models.TextField(blank=True)
reference = models.CharField(max_length=150, blank=True)
def __str__ (self):
return self.title
class QuizQuestions(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
question = models.TextField()
points = models.IntegerField()
现在我的幻灯片模型可以是 3 种事物中的一种:
- 文本(原始 HTML)
- 视频
- 测试
如何设计我的数据库幻灯片模型,使其可以是 link 视频、HTML 或测验?
我的想法是:
- 我可以在 Slide 中创建一个模块路径,该路径将是
连接文本将是连接数据库和外键
对它
- 以某种方式创建一个连接到任何其他的外键
数据库表
如果您有任何更好的想法,请告诉我,我想要一个可扩展的解决方案,并且我乐于接受新想法
有几种方法可以实现这一点。
- 您可以使用
GenericForeignKey
- 您也可以使用 model inheritance by, for example, having a SlideContent model that each of the Text, HTML, and Video models derive from using multi-table inheritance 执行此操作。然后 Slide 可以有一个指向 SlideContent 模型的外键。
我正在开发一个内容管理系统,用户可以在其中创建课程供学生学习。
到目前为止,我的数据库有课程、课程和幻灯片模型,我想将我的幻灯片模型连接到测验、HTML 或视频:
class Course(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
slug = models.SlugField(max_length=40, unique=True)
name = models.CharField(max_length=100)
desc = models.CharField(max_length=1000)
date_created = models.DateTimeField(default=datetime.now, blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
price = models.DecimalField(max_digits=8, decimal_places=2)
is_visible = models.BooleanField(default=True)
def __str__ (self):
return self.name
class Lesson(models.Model):
course = models.ForeignKey(Course, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
order = models.IntegerField()
def __str__ (self):
return self.name
class Quiz(models.Model):
points = models.IntegerField()
# Link to quiz model
class HTML(models.Model):
content = models.TextField(blank=True)
class Video(models.Model):
media_path = models.CharField(max_length=150)
class Slide(models.Model):
lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
slide_type = models.CharField(max_length=100, choices=[("video", "Video"),("image", "Image"), ("text", "Text"), ("quiz", "Quiz")])
notes = models.TextField(blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
content = models.TextField(blank=True)
reference = models.CharField(max_length=150, blank=True)
def __str__ (self):
return self.title
class QuizQuestions(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
question = models.TextField()
points = models.IntegerField()
现在我的幻灯片模型可以是 3 种事物中的一种:
- 文本(原始 HTML)
- 视频
- 测试
如何设计我的数据库幻灯片模型,使其可以是 link 视频、HTML 或测验?
我的想法是:
- 我可以在 Slide 中创建一个模块路径,该路径将是 连接文本将是连接数据库和外键 对它
- 以某种方式创建一个连接到任何其他的外键 数据库表
如果您有任何更好的想法,请告诉我,我想要一个可扩展的解决方案,并且我乐于接受新想法
有几种方法可以实现这一点。
- 您可以使用
GenericForeignKey
- 您也可以使用 model inheritance by, for example, having a SlideContent model that each of the Text, HTML, and Video models derive from using multi-table inheritance 执行此操作。然后 Slide 可以有一个指向 SlideContent 模型的外键。