【发布时间】:2019-05-31 17:19:50
【问题描述】:
好的,我在理解 Django 的加入和别名时遇到了一些麻烦。我的模型中有四个这样定义的表:(我已经删除了不相关的列)
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;
但我终其一生都无法弄清楚如何使用 orm 来做到这一点。我什至无法连接两个表并从中选择数据,更不用说处理别名了。这是据我所知:
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]
感谢两位回答者,他们很有启发性。
【问题讨论】:
标签: python django postgresql orm