Внешний ключ для нескольких других таблиц - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над системой управления контентом, в которой пользователь может создать курс для прохождения студентом.

Пока в моей базе данных есть модели курсов, уроков и слайдов, и я хочу подключить свой слайдмодель для викторины, 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()

Теперь моя модель слайда может быть 1 из 3 вещей:

  1. Текст (необработанный HTML)
  2. Видео
  3. Тест

Как мне спроектировать модель слайдов базы данных, чтобы она могла быть ссылкой на видео, HTML или викторину?

Мои мысли:

  1. Я мог бы создать путь к модулю в Slide, и путь был бы соединяющим текстом, был бы базой данных соединений и внешним ключом к нему
  2. Каким-то образом создайте внешний ключ, который подключается к любой из других таблиц базы данных.

Дайте мне знать, если у вас есть идеи получше, я бы хотел масштабируемое решение, и я открыт для новых идей.

1 Ответ

0 голосов
/ 19 декабря 2018

Есть несколько способов реализовать это.

  1. Вы можете сделать это с GenericForeignKey
  2. Вы также можете сделать это с наследованием модели , например, имеямодель SlideContent, которую каждая из моделей Text, HTML и Video извлекает из использования многостолового наследования .Тогда у Slide может быть внешний ключ для модели SlideContent.
...