[英]Django filter Foreign query Key
在这个问答游戏中,我试图过滤特定课程的问题。
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)
在上面的 class Quizgame 中,我在这里过滤了get_new_question方法中的问题,我通过了 course_id 作为参数,因为我不知道如何用 course_id 过滤掉特定的课程问题。
如果您尝试将问题链接到课程,我在您的 AttemptedQuestion class 中看不到与课程 object 相关的外键。 你应该添加
class AttemptedQuestion(models.Model):
# ...
course = models.ForeignKey(Course, on_delete=models.CASCADE, null=True)
然后你可以简单地过滤
qs = AttemptedQuestion.objects.filter(course=course_id)
在回答您的问题之前,有一个简单的提示可以帮助您提高代码的可读性。
如果要为名为Course
的 model 创建 FK,请将字段命名为course
。 “course_name”意味着我们将在该字段中获得一个名称。
要通过course_id
变量访问所有Quiz
实例,您可以在 filter() 方法中使用__
运算符,如下所示:
Quiz.objects.filter(course_name__id=course_id)
请注意“课程名称”后面的双下划线__
。 这样做是告诉 Django:“在 course_name 的 id 等于 'course_id' 的情况下筛选测验”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.