Django基于父长度建模默认值

46qrfjad  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(103)

我正在做一个应用程序,有多个考试和多个问题,每个考试。
这是我目前的“问题”模型:

class Question(models.Model):
    exam = models.ForeignKey(Exam, related_name='questions', on_delete=models.CASCADE)
    question = models.TextField()
    explanation = models.TextField(blank=True, null=True)
    TOPICS = [
        ('NA', 'Not Available'),
        ('Algebra', 'Algebra'),
        ('Geometry', 'Geometry'),
        ('Trig', 'Trigonometry'),
        ('Calc', 'Calculus'),
        ('Chem', 'Chemistry'),
        ('Geology', 'Geology'),
        ('Physics', 'Physics'),
        ('Reading', 'Reading'),
        ('Writing', 'Writing'),
        ('Spelling', 'Spelling'),
        ('Comprehension', 'Reading Comprehension'),
    ]
    topic = models.CharField(max_length=20, choices=TOPICS, default='NA')
    order = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True)
    attempts = models.IntegerField(default=0, editable=False)
    correct_attempts = models.IntegerField(default=0, editable=False)

    class Meta:
        unique_together = ['exam', 'order']

    def __str__(self):
        return f'{self.exam} - Q{self.order}'

除了“order”字段外,您几乎可以忽略所有字段。此字段显示问题在考试中出现的顺序。
我希望此顺序字段的默认值为考试中现有问题的数量+ 1
例如,如果我的考试已经有两个问题,而我正尝试添加第三个问题,则此问题的顺序将默认为“3”,除非我手动更改它。
我知道这不起作用,但这个解决方案的工作原理与下面这行代码类似:

default=Question.objects.filter(exam=self.exam).count() + 1

我在为django中的模型创建函数方面缺乏经验,所以请让我知道我会如何做这样的事情,谢谢!

tv6aics1

tv6aics11#

我用以下代码重写保存()函数来解决这个问题:

def save(self, *args, **kwargs):
        self.order = Question.objects.filter(exam=self.exam).count() + 1

        super().save(*args, **kwargs)  # Call the "real" save() method.

相关问题