Структура модели 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}"

нормально ли работает эта схема модели или я могу ее как-то улучшить

Вот несколько предложений по улучшению ваших моделей:

  1. Лучше не использовать поле type в модели Question, вы можете получить доступ к тип вопроса из поля subtype. Рассматривайте тип вопроса как группировка для подтипов.

  2. Вы использовали необязательные поля в методе str вашего класса Question которые могут быть null, вам следует проверить это в str, иначе вы получите ошибку.

  3. Вы не можете вызывать поле 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}"
    

Вот несколько предложений:

  1. Если предполагается, что подтип вопроса напрямую связан с его типом, необходимо обеспечить целостность этой связи на уровне модели.

  2. Если вы часто обращаетесь к типу и подтипу вопроса вместе, рассмотрите возможность использования в запросах Django функции select_related для предварительной выборки связанных объектов и уменьшения количества обращений к базе данных.

Вернуться на верх