python - 如何获取由外键 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>
解决方案
您在这里使用 django_filter。您可以在 QuestionFilter 中覆盖其 qs 函数。这可以帮助您以自己的方式扩展查询。返回的结果可能包含一个标志,表明它是否已添加到测验中。链接参考包含 qs 函数扩展详细信息。 qs 函数
def qs(self):
parent = super().qs
d= parent.prefetch_related('quizquestion')
return d
推荐阅读
- python - Python objects.all 命令未注册?
- javascript - $mergeObjects 阶段的 MongoDB 3.2 等效项
- php - 在产品属性下拉菜单 woocommerce 旁边添加工具提示描述
- mysql - SQL SELECT 重复行添加到列
- python-3.x - How to run headless firefox browser on remote server over SSH connection?
- javascript - 可折叠侧边栏.....想要修复侧边栏的页眉和页脚部分
- visual-studio - Visual Studio 编辑器:始终在现有行的结尾处添加新的代码行
- json - Swift 如何最好地推进嵌套 JSON
- c# - 将实体添加到另一个实体的子集合时重复。感谢覆盖的 Equals?
- apache-kafka - 我能否从 Kafka 主题的特定分区中读取数据