【发布时间】:2019-08-08 12:01:43
【问题描述】:
我有两个模型:Exam 和 Question。每个问题都有在每次考试中自动计算的分数。
这是我的文件:
#Models.py
class Exam(models.Model):
questions = models.ManyToManyField(Question)
title = models.CharField()
class Question(models.Model):
title = models.CharField()
answer = models.TextField()
points = models.PositiveSmallIntegerField()
#Forms.py
class ExamForm(ModelForm):
class Meta:
model = Exam
fields = '__all__'
#Views.py
if form.is_valid():
new_exam = form.save(commit=False)
# Some modify goes here.
new_exam.save()
form.save_m2m()
return redirect('view_exam')
我确实自定义了Exam模型的save()方法:
def save(self, *args, **kwargs):
self.point = 0
for question in self.questions:
self.point += question.point
super(Exam, self).save(*args, **kwargs)
但我得到了这个错误:
"<Exam: NewObject>" needs to have a value for field "id" before this many-to-many relationship can be used.
我怎样才能做到这一点而不引发任何错误?
我的目标:对于每一个新创建的考试,计算本次考试的题目分数,并将它们放入Exam模型的points字段中。
【问题讨论】:
-
在保存对象之前您无法访问
self.questions。首先调用super().save()方法,然后访问问题。但这毫无意义,因为: 1.Exam没有字段point所以设置self.point没有意义,因为它没有保存,因此一旦退出form_valid()方法就会丢失。 2.questions还没有被保存(因为你还没有调用form.save_m2m())所以对于新对象,什么都不会发生。 -
告诉我们您想用自定义方法做什么,然后我们可能会帮助提出替代方案。现在你应该删除你的自定义保存方法,因为它没有任何作用。然后一切都会正常。
-
最后,我必须做什么?请写下你的答案。 @dirkgroten
-
好的,我在我的问题中写下我的目的。 @dirkgroten
-
我写了我要找的东西。 @dirkgroten
标签: python django django-models many-to-many django-2.2