Джанго троичные модели отношений с ограничениями - PullRequest
0 голосов
/ 26 октября 2019

В рамках онлайн-платформы Django, предлагающей онлайн-курсы, авторы курсов могут свободно включать упражнения из общедоступного хранилища упражнений.

Каждый курс имеет свои собственные главы и свободен в том, как организовать упражнения вглавы.

Упражнение в курсе может быть частью нулевой или одной главы. Когда глава в курсе удаляется, упражнения в нем просто возвращаются к статусу не назначенной главы.

Что у меня есть:


class Exercise(models.Model):
    title = models.CharField(max_length=30)


class Course(models.Model):
    title = models.CharField(max_length=30)
    exercises = models.ManyToManyField(Exercise)


class Chapter(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    title = models.CharField(max_length=30)

Проблема:
Пока что нет никакой связи между упражнениями и главами курса, мне не ясно, как сделать это должным образом, принимая во внимание ограничение, что упражнение в главе должно быть в курсеа также.

1 Ответ

2 голосов
/ 26 октября 2019

Это должно работать. Там написано, что сначала нужно создать курс (обязательно). И тогда вы можете либо создать главу, либо курс, при создании главы обязательно, чтобы вы связали ее с курсом. При создании упражнения вы должны связать его с курсом (обязательным), но не с главой, но если он связан с главой и эта глава впоследствии будет удалена, то глава, поданная в упражнении, будет не назначена или будет иметь значение NULL.

class Exercise(models.Model):
     title = models.CharField(max_length=30)
     course = models.ForeignKey(Course, blank=False, null=False, on_delete=models.SET_NULL) #if you want the exercise to be deleted when a course is deleted set it to CASCADE
     chapter = models.ForeignKey(Chapter, on_delete=models.SET_NULL)


class Chapter(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE, blank=False, null=False)
    title = models.CharField(max_length=30)

class Course(models.Model):
    title = models.CharField(max_length=30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...