Как получить данные определенного идентификатора, на который ссылается внешний ключ django? - PullRequest
4 голосов
/ 14 апреля 2020

Там есть список всех вопросов с правильными и неправильными (оценки, если вопрос неправильный и правильный) с кнопкой «Добавить», прикрепленной к каждому.

Когда я нажимаю кнопку «Добавить», вопрос добавляется в викторину в QuestionQuiz, модель вместе со своими баллами, правильными значениями +1 и неверными -1, обновляются в базе данных.

Соответствующие вопросы Идентификатор отправляется через URL-адрес в виде представления изображения, прикрепленном ниже: path('filter_list/<pk>',views.FilterQuestionView.as_view(),name='filter'),

Чего я хочу достичь, так это того, что при начальной загрузке страницы я хочу показать оценки по соответствующему вопросу на основе идентификатор опроса, полученный из базы данных. Как я могу получить все название и описание вопроса, и если вопрос добавлен в викторину или нет

Каким будет django способ добиться этого?

Может быть, есть возможность получить все данные, включая те, которые уже добавлены в викторину, например, его текущие выборки title,description остальные поля - stati c

Я могу изменить выборку title,decription,correct,incorrect,flag(true if added to current quiz_id else false)

Изображение прикреплено

Here

Предположим, к вопросу добавлен вопрос. Текст в кнопке должен быть ДОБАВЛЕНО , и правильные и неправильные должны обновляться при первоначальной загрузке страницы. Здесь первый вопрос добавлен в викторину. ПРИМЕЧАНИЕ. Значение = 1 - это значения по умолчанию, которые обновляются пользователем для правильных и неправильных значений.

Ниже приводится модель, которую я создал:

class Question(models.Model):
	title = models.CharField(max_length=255 )
	description = models.TextField(max_length=300)
  

class Quiz(models.Model):
	name = models.CharField(max_length=225,blank=False )
	quiz_type =models.IntegerField(choices=QUIZ_TYPE,default=0)
    questions = models.ManyToManyField( Question, through='QuestionQuiz', related_name="quiz_question") 
	categories= models.ManyToManyField(Category,through='CategoryQuiz',related_name='quiz_category')		
 

class QuestionQuiz(models.Model):
	quiz = models.ForeignKey(Quiz,on_delete=models.CASCADE)
	question = models.ForeignKey(Question,on_delete=models.CASCADE)	
	correct =models.DecimalField(max_digits=4, decimal_places=3)
    incorrect= models.DecimalField(max_digits=4, decimal_places=3) 

	class Meta:
		unique_together = ('quiz','question')

Views.py - Использовал пакет django_filter для создания фильтра

class FilterQuestionView( AddQuestionAjaxFormMixin,FormMixin,FilterView):
 
	form_class = QuestionQuizForm
	filterset_class =  QuestionFilter
	paginate_by = 5
	context_object_name = 'questions'
Это шаблон:

{% for question in questions %}
   		<tr>
        <form method='POST'   id="q_{{question.id}}"> 
   		<td>{{question.title}}</td>
   		<td>{{question.description}}</td>
   	 

   		 
      <td><input type="text" value="1" id="correct_{{question.id}}"></td>

      <td><input type="text" value="1" id="incorrect_{{question.id}}"></td>
      <td> 
            <a id="btn_{{question.id}}" class="btn purple-gradient" onclick="addRemoveQuestion({{question.id}},{{quiz}})"  >Add</a>
       </td>
      </form>

Ответы [ 3 ]

3 голосов
/ 15 апреля 2020

Вы используете django_filter здесь. Вы можете переопределить функцию qs в QuestionFilter. Это может помочь вам расширить ваш запрос на вашем пути. Возвращенный результат может содержать флаг, указывающий, что он уже добавлен в тест или нет. Ссылка содержит подробное описание функции qs. функция qs

def qs(self): parent = super().qs d= parent.prefetch_related('quizquestion') return d

2 голосов
/ 15 апреля 2020

Вы можете использовать предварительную выборку, чтобы получить данные из связанной таблицы в обратной зависимости

q = Question.objects.prefetch_related( 'questionquiz_set')

Будут получены все вопросы с опросом.

0 голосов
/ 14 апреля 2020

Я думаю, вам следует немного отредактировать свой вопрос, чтобы он был более понятным, потому что для меня это еще не ясно. Извините, я не могу добавить комментарий из-за своей репутации. Однако я не знаю, отвечаете ли вы на это или нет, но вы можете использовать

def get_context_data(self, *, object_list=None, **kwargs):
    context = super(FilterQuestionView, self).get_context_data(**kwargs)

, тогда вы можете добавить все, что запросите из базы данных в контекстном словаре, создав запрос, соответствующий вашему случаю.

Проверьте эту ссылку

Проверьте эту ссылку , чтобы узнать, как создать хороший запрос.

Надеюсь, это может помочь.

...