Хорошо, у меня возникли проблемы с пониманием того, как Джанго присоединяется и алиасуется. У меня есть четыре таблицы, определенные как таковые в моих моделях: (я удалил ненужные столбцы)
class Field(models.Model):
name = models.CharField(max_length=200, default='')
class Survey(models.Model):
name = models.CharField(max_length=200, default='')
class Question(models.Model):
text = models.CharField(max_length=200, default='')
survey = models.ForeignKey(Survey)
class Answer(models.Model):
question = models.ForeignKey(Question)
field = models.ForeignKey(Field)
Теперь я могу написать очень простой и понятный SQL-запрос, чтобы получить именно то, что я хочу. который выглядел бы так:
SELECT s.id, s.name,
q.id as q_id, q.text,
f.id as f_id, f.name as answer
FROM "App_survey" s
JOIN "App_question" q
ON q.survey_id = s.id
JOIN "App_answer" a
ON a.question_id = q.id
JOIN "App_field" f
ON a.field_id = f.id;
Но я не могу понять, как это сделать, используя форму. Я даже не могу соединить две таблицы и выбрать данные из обеих, не говоря уже о псевдонимах. Это насколько я получил:
questions = Question.objects.prefetch_related('survey')
questions_dict = [{'form':x.name, 'id':x.id, 'question':x.text} for x in questions]
Это дает мне объект «Вопрос», не имеющий атрибута «имя», ошибка.
Примечание: это postgres и python, и я новичок в обоих.
Обновление: это последний код, который я использовал, который работает:
answers = Answer.objects.annotate(
s_id=F('question__survey__id'),
s_name=F('question__survey__name'),
q_id=F('question__id'),
text=F('question__text'),
f_id=F('field__id'),
answer=F('field__name')
)
surveys_dict = [{
'id': x.s_id,
'name':x.s_name,
'q_id':x.q_id,
'text':x.text,
'f_id':x.f_id,
'answer':x.answer
} for x in answers]
благодаря обоим ответчикам, они были просветляющими.