Django Перечислите мои связанные много-много объектов - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть эти модели:

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'

Но я не смог выяснить код этого свойства, поэтому он вернул бы индекс связанных вопросов.

Есть предложения? Спасибо

1 Ответ

1 голос
/ 10 апреля 2020

Простой способ сделать это - вставить каждый индекс в вопросы, возвращаемые набором запросов. Это должен быть модельный метод на 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() способ.

...