Выполнить JOIN в таблицах django - PullRequest
0 голосов
/ 15 апреля 2020

Выполнить ПРИСОЕДИНЕНИЕ в django извлечения связанной даты в обратной взаимосвязи. Есть три модели.

Ниже приведен код для моделей

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 имеет отношение внешнего ключа с вопросом. Мне нужно получить все из вопроса JOIN и записи из QuestionQuiz с определенным quiz_id.

Предположим, quiz_id = 3 Затем я получу все вопросы с правильными и неправильными. если этот идентификатор теста добавлен к вопросу, тогда он будет отображаться неправильно, иначе они будут пустыми.

question_id | title|description|correct|incorrect|quesquizid<br> 1 | Q1 |Q1desc |2 | -2 | 1 2 | Q2 |Q2desc | | |

Ques_id = 1 добавлен в quiz_id = 3 .ques_id = 2 не добавлен to 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)

Пожалуйста, проверьте результат запроса:

enter image description here

1 Ответ

4 голосов
/ 15 апреля 2020

Я думаю, prefetch_related вместе с Prefetch может дать вам желаемый результат.

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

Может извлекать все связанные данные вместе с нулем, если они существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...