首页 > 解决方案 > 如何获取由外键 django 引用的特定 id 的数据?

问题描述

有一个正确和不正确的问题列表(如果问题是错误和正确的,则得分),每个问题都附有添加按钮。

当我点击添加按钮时,问题被添加到测验QuestionQuiz中,模型连同他们的分数正确得到 +1 和不正确的 -1 被更新到数据库。

相应的测验 id 是通过下面附加的表单视图图像中的 url 发送的:path('filter_list/<pk>',views.FilterQuestionView.as_view(),name='filter'),

我想在这里实现的是,当页面最初加载时,我想根据从数据库中获取的测验 id 显示相应问题的分数。如何获取所有问题的标题和描述,以及问题是否添加到测验中

实现这一目标的 django 方法是什么?

可能有一个获取所有数据的方法,包括已经在测验中添加的数据,就像它当前获取的 title,description 其余字段是静态的一样

我可以改变 fetchtitle,decription,correct,incorrect,flag(true if added to current quiz_id else false)

图片已附上

这里

假设向测验添加了一个问题。按钮中的文本必须是ADDED并且在最初加载页面时必须更新正确和不正确的内容。这里第一个问题被添加到测验中。注意:值 = 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>

标签: pythondjangodjango-3.0

解决方案


您在这里使用 django_filter。您可以在 QuestionFilter 中覆盖其 qs 函数。这可以帮助您以自己的方式扩展查询。返回的结果可能包含一个标志,表明它是否已添加到测验中。链接参考包含 qs 函数扩展详细信息。 qs 函数

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


推荐阅读