我有那些型号:
class Question(models.Model):
description = models.CharField(max_length = 255)
class Quiz(models.Model):
name = models.CharField(max_length = 32)
questions = models.ManyToManyField(Question, related_name = 'questions')
我感兴趣的是有一个属性,它可以返回相关测试的索引值。
因此,当我在我的观点中这样做时:
def view_quiz(request,slug):
quiz = Quiz.objects.get(name = slug)
questions = quiz.questions.all()
return render(request = request, template_name = 'main/quiz.html', context = {'quiz': quiz,'questions': questions})
我也可以访问该问题的索引。
我在想创建一个这样的属性问题模型:
class Question(models.Model):
description = models.CharField(max_length = 255)
options = models.ManyToManyField(Option, related_name = 'options',default = None)
@property
def question_number(self):
return 'index of the related quiz'
但我无法计算出该属性的代码,因此它将返回相关问题的索引。
有什么建议吗?感谢
一种简单的方法是将每个索引注入查询集返回的问题中。这应该是Quiz
上的一个模型方法,因为两个测验可以共享相同的Question
对象。
注意:
问题的索引取决于顺序,并且您的quiz.questions.all()
查询集现在的顺序不稳定——数据库不一定每次都以相同的顺序返回问题。为了强制稳定排序,我将假设Question
实例是按name
排序的。
class Quiz(models.Model):
...
def ordered_questions(self):
questions = self.questions.order_by("name")
# You can change to zero based indexing using `start=0`
for index, question in enumerate(questions, start=1):
question.index = index # Inject the index into the question
# Use a yield statement here to keep the queryset lazy and efficient.
yield question
然后,无论您在哪里需要访问每个问题的索引,都可以使用quiz.ordered_questions()
方法。