具有类型和子类型的问题的 Django 模型结构

问题描述 投票:0回答:1

这种类型的模型架构可以吗 我有一个问题,它肯定有一个类型,但子类型是可选的

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}"

这个模型架构可以吗?我可以以任何方式改进它吗

python django database foreign-keys
1个回答
0
投票

这里有一些改进模型的建议:

  1. 问题模型中最好不要使用type字段,您可以 从子类型字段访问问题类型。看问题 输入作为子类型的分组

  2. 您在 str 方法中使用了可选字段 问题 模型类可以为 null,您应该在 str 中检查它 ,否则你会得到一个错误

  3. 你不能在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}"
© www.soinside.com 2019 - 2024. All rights reserved.