Django 枚举我相关的多对多对象

Django Enumerate my related many to many objects

我有那些模型:

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')

我对 属性 感兴趣,其中 return 是相关测验的索引值。

所以当我在我看来这样做时:

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'

但我想不出那个 属性 的代码,所以它将 return 相关问题的索引。

有什么建议吗?谢谢

一个简单的方法是将每个索引注入到查询集 return 编辑的问题中。这应该是 Quiz 上的模型方法,因为两个测验可以共享相同的 Question 对象。

注意:问题的索引是顺序相关的,你的quiz.questions.all()查询集现在顺序不稳定-数据库不一定会 return 每次都以相同的顺序出现问题。为了强制稳定排序,我将假设 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() 方法。