Структура модели Django для вопроса с типом и подтипом
является ли такой тип схемы модели нормальным у меня есть вопрос, который наверняка будет иметь тип, но подтип необязателен
class QuestionType(models.Model):
question_type = models.CharField(max_length=255)
def __str__(self):
return self.question_type
class QuestionSubType(models.Model):
question_type = models.ForeignKey(QuestionType, on_delete=models.CASCADE)
question_sub_type = models.CharField(max_length=255)
class Question(QuestionAbstractModel):
chapter = models.ForeignKey(Chapter, blank=True, null=True, on_delete=models.CASCADE)
type = models.ForeignKey(QuestionType, on_delete=models.CASCADE, blank=False)
type_subtype = models.ForeignKey(QuestionSubType, on_delete=models.CASCADE, blank=True, null=True)
solution_url = models.URLField(max_length=555, blank=True)
def __str__(self):
return f" {self.chapter.subject.grade} {self.chapter.subject.name} {self.chapter.name} {self.type}"
нормально ли работает эта схема модели или я могу ее как-то улучшить
Вот несколько предложений по улучшению ваших моделей:
Лучше не использовать поле type в модели Question, вы можете получить доступ к тип вопроса из поля subtype. Рассматривайте тип вопроса как группировка для подтипов.
Вы использовали необязательные поля в методе str вашего класса Question которые могут быть null, вам следует проверить это в str, иначе вы получите ошибку.
Вы не можете вызывать поле FK в методе str так f"{self.type}". Вам следует переписать метод str метода QuestionSubType модели и вызвать str(self.type_subtype).
class Question(QuestionAbstractModel): chapter = models.ForeignKey(Chapter, blank=True, null=True, on_delete=models.CASCADE) type_subtype = models.ForeignKey(QuestionSubType, on_delete=models.CASCADE, blank=True, null=True) solution_url = models.URLField(max_length=555, blank=True) def __str__(self): chapter_str = f"{self.chapter.subject.grade} {self.chapter.subject.name} {self.chapter.name}" if self.chapter else "No Chapter" type_subtype_str = str(self.type_subtype) if self.type_subtype else "No Type/Subtype" return f"{chapter_str} {type_subtype_str}"
Вот несколько предложений:
Если предполагается, что подтип вопроса напрямую связан с его типом, необходимо обеспечить целостность этой связи на уровне модели.
Если вы часто обращаетесь к типу и подтипу вопроса вместе, рассмотрите возможность использования в запросах Django функции select_related для предварительной выборки связанных объектов и уменьшения количества обращений к базе данных.