为了账号安全,请及时绑定邮箱和手机立即绑定

在表 django 中执行 JOIN

在表 django 中执行 JOIN

慕尼黑的夜晚无繁华 2022-10-11 15:12:43
在 django 中执行 JOIN 以反向关系获取相关日期。共有三种型号。以下是模型的代码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')在此,使用模型问题测验将问题添加到测验中。这里, QuizQuestion 与问题有外键关系。我需要从带有特定 quiz_id 的 QuestionQuiz 中获取所有问题 JOIN 和记录。假设 quiz_id =3 那么我将获取所有正确和不正确的问题。如果该测验 id 被添加到问题中,那么它将显示正确不正确,否则这些将是空白的。question_id | title|description|correct|incorrect|quesquizid          1  | Q1   |Q1desc     |2      |   -2    |   1          2  | Q2   |Q2desc     |       |         |ques_id =1 添加到 quiz_id=3 .ques_id=2 未添加到 quiz_id=3。因此,正确不正确为空白。我尝试了以下操作,但它会获取所有问题和相关的测验分数,而不管它们在当前测验中是否出现:Question.objects.prefetch_related('questionquiz_set').all()结果应类似于以下查询Select * from  question as qs   LEFT JOIN  questionquiz as qq on (qq.question_id = qs.id AND qq.id=3)请检查查询结果:
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我认为 prefetch_related 和 Prefetch 可能会给你带来想要的结果。

q = Question.objects.prefetch_related(                Prefetch('questionquiz_set', queryset=QuestionQuiz.objects.filter(quiz=3))            )        print(q)

这可能会检索所有相关数据以及 null(如果存在)。


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信