Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django筛选器外部查询键_Python_Django - Fatal编程技术网

Python Django筛选器外部查询键

Python Django筛选器外部查询键,python,django,Python,Django,在这个问答游戏中,我试图过滤特定课程的问题 models.py class Course(models.Model): course_name = models.CharField(max_length=50) date_created = models.DateTimeField(auto_now_add=True) class Quiz(models.Model): course_name = models.ForeignKey(Course, on_delete

在这个问答游戏中,我试图过滤特定课程的问题

models.py

class Course(models.Model):
    course_name = models.CharField(max_length=50)
    date_created = models.DateTimeField(auto_now_add=True)

class Quiz(models.Model):
    course_name = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='quiz_course')
    question = models.TextField(max_length=100)

class Choice(models.Model):
    question = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name="choice_question")
    choice = models.CharField(max_length=100)
    is_true = models.BooleanField("This is Correct Answer", default=False)

class Quizgame(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    total_score = models.DecimalField("Total score", default=0, decimal_places=2, max_digits=6)
    start_time = models.DateTimeField(auto_now_add=True)
    finish_time = models.DateTimeField(null=True)
    
    def get_new_question(self,course_id):
        used_question = AttemptedQuestion.objects.filter(quiz_profile=self).values_list('question__id',flat=True)
        remaining_questions = Quiz.objects.exclude(id__in=used_question)
        if not remaining_questions.exists():
            return
        return random.choice(remaining_questions)
    
    def create_attempt(self, question):
        attempted_question = AttemptedQuestion(question=question, quiz_profile=self)
        attempted_question.save()

class AttemptedQuestion(models.Model):
    quiz_profile = models.ForeignKey(Quizgame, on_delete=models.CASCADE, related_name='attempt')
    question = models.ForeignKey(Quiz, on_delete=models.CASCADE)
    choice = models.ForeignKey(Choice, on_delete=models.CASCADE, null=True)
    is_true = models.BooleanField(default=False)

在上面的Quizgame课堂中,我用获取新问题方法过滤问题。在这里,我通过了一个课程id作为参数,我不知道如何用课程id过滤特定课程问题。

如果你试图将一个问题链接到一个课程,在您的AttemptedQuestion类中,我看不到与课程对象相关的ForeignKey。你应该加上

class AttemptedQuestion(models.Model):
# ...
课程=models.ForeignKey(课程,on_delete=models.CASCADE,null=True)
然后你可以简单地通过

qs=AttemptedQuestion.objects.filter(课程=课程id)

在回答您的问题之前,有一个简单的提示可以帮助您提高代码的可读性

如果要为名为
课程
的模型创建FK,请将字段命名为
课程
。“课程名称”意味着我们将在该字段中获得一个名称

要通过
course\u id
变量访问所有
quick
实例,可以在filter()方法中使用
\u
运算符,如下所示:

Quiz.objects.filter(course_name__id=course_id)
请注意“课程名称”后的双下划线
。这告诉Django:
“筛选测验,其中课程名称的id等于‘课程id’”