【问题标题】:How to fetch data of a particular id refrenced by foreign key django?如何获取外键 django 引用的特定 id 的数据?
【发布时间】:2020-04-14 16:25:45
【问题描述】:

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

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

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

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

django 的实现方式是什么?

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

我可以更改 fetch title,decription,correct,incorrect,flag(true if added to current quiz_id else false)

图片已附上

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

【问题讨论】:

    标签: python django django-3.0


    【解决方案1】:

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

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

    【讨论】:

    • 是否达到目标让我试试
    【解决方案2】:

    您可以使用预取来以反向关系从相关表中获取数据

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

    将检索所有带有测验的问题。

    【讨论】:

      【解决方案3】:

      我认为您应该稍微修改一下您的问题,以便更容易理解,因为我还不清楚。很抱歉,由于声誉问题,我无法添加评论。 但是,我不知道您是否回答,但您可以使用

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

      然后,您可以通过创建适合您情况的查询,将您从数据库中查询的任何内容添加到上下文字典中。

      查看link

      查看此link 了解如何创建良好的查询。

      我希望这会有所帮助。

      【讨论】:

      • 我已经用其他细节更新了这个问题。
      • 我又读了一遍。到目前为止,我的理解是,您不想在数据库中显示所有问题,而是希望与测验相关的问题。对吗?
      • 不,我想显示所有问题,但如果问题在测验中,则该问题必须在按钮文本上标记为 ADDED 而不是 ADD
      • 您可以返回测验中已经存在的问题的字典。然后在&lt;a id="btn_{{question.id}}" class="btn purple-gradient" onclick="addRemoveQuestion({{question.id}},{{quiz}})" &gt;Add&lt;/a&gt; 之前使用一个简单的 if 条件来检查问题是否在这本字典中。如果为真,则添加添加,否则您添加添加。告诉我这是否有效
      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2018-05-23
      • 2015-10-15
      • 2020-01-27
      相关资源
      最近更新 更多