Моделирование платформы электронного обучения Django
Я делаю веб-приложение/блог для электронного обучения и у меня есть 2 модели: Курсы и Главы, так что очевидно, что курс может иметь несколько глав, но что я хочу сделать, допустим, у меня есть курс с 12 главами, я хочу сгруппировать главы в части без создания другой модели пример:
Курс: Exemple_Course
>- Часть 01: 5 глав
- Часть 02: 5 глав
- Часть 03: 2 главы
вот мой код :
class Article(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=True
)
title = models.CharField(max_length=120)
description = models.TextField()
slug = models.SlugField(blank=True,null=True,)
date = models.DateTimeField( auto_now_add = True)
allowed_subscription = models.ManyToManyField(Plan,blank=True, null=True,)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('articles:article-detail', kwargs={'article_slug': self.slug})
def pre_save_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = unique_slug_generator(instance)
pre_save.connect(pre_save_receiver, sender=Article)
CHAPTER_TYPES = (
('CHAPTER', 'Chapter'),
('SUB_CHAPTER', 'Sub chapter'),
)
class Chapter(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(blank=True,null=True,)
article = models.ForeignKey(Article,on_delete=models.CASCADE,null=True,blank=True,)
content = models.TextField()
chapter_type = models.CharField(max_length=256, choices=CHAPTER_TYPES)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('articles:chapter-detail', kwargs={'article_slug': self.article.slug,'chapter_slug': self.slug,})
pre_save.connect(pre_save_receiver, sender=Chapter)
Хотя имеет смысл сделать другую модель, другой способ справиться с этим - добавить еще одно поле "part" в вашу модель, иметь общий ключ для ваших курсов (например, name) и создать ограничение unique_together.
Делая это, вы логически создаете "составной первичный ключ" для ваших моделей (являющийся (имя_курса, часть).