这种类型的模型架构可以吗 我有一个问题,它肯定有一个类型,但子类型是可选的
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字段,您可以 从子类型字段访问问题类型。看问题 输入作为子类型的分组
您在 str 方法中使用了可选字段 问题 模型类可以为 null,您应该在 str 中检查它 ,否则你会得到一个错误
你不能在str方法f"{self.type}"中这样调用FK字段。你应该重写Question Type模型的str方法并调用str(self.type)。
这是您的问题模型的更正版本:
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}"