Преобразование SQL-запроса в выражение Django
Предположим, что у меня есть следующие модели Django и соответствующие SQL-таблицы с некоторыми данными:
Ответ пользователя:
id | answer | partquestion_id |
---|---|---|
1 | 667 | 1 |
PartQuestion:
id | question_id |
---|---|
1 | 1 |
Решение:
id | content | question_id |
---|---|---|
1 | 667 | 1 |
2 | 85 | 2 |
Я хочу получить все ответы пользователей, где ответ равен решению соответствующего вопроса. Я придумал такой SQL-запрос, но не могу придумать, как реализовать его в запросе Djano:
select * from (useranswer join partquestion on
useranswer.partquestion_id = partquestion.id) join solution on
partquestion.question_id = solution.question_id where answer=content;
В результате будет выведено следующее:
id | answer | partquestion_id | id | question_id | id | content | question_id |
---|---|---|---|---|---|---|---|
1 | 667 | 1 | 1 | 1 | 1 | 667 | question_id |
Я просто не могу разобраться с этой концепцией в Django. Может быть, использовать F-выражения и что-то еще.
Спасибо за любой совет.
Вы можете просто использовать значения и отношения __
для обхода внешних ключей.
UserAnswer.objects.values('id', 'answer', 'partquestion_id', 'partquestion_set__id', 'partquestion_set__question_id')
К сожалению, для меня не достаточно очевидно, как получить эти столбцы для последней таблицы, но я надеюсь, что из этого ответа вы сможете понять, как это сделать?
Хорошо, я просто понял это сам, прочитав ответ и комментарии от @Swift.
Это:
UserAnswer.objects.filter(partquestion__question__solution__content=F('answer'))
Теперь это довольно просто, но я просто попробовал использовать solution_set
вместо просто solution
.
Если вы определите свои модели следующим образом:
class UserAnswer(models.Model):
question = models.ForeignKey(questions,on_delete=models.CASCADE)
user_answer = models.CharField()
class questions(models.Model):
question = models.CharField()
answer = models.CharField()
тогда этот фильтр должен работать
right_answers = UserAnswer.objects.filter(question__answer = user_answer )