我要从3个不同的表中获取数据库中的数据,并且需要将它们全部作为1个对象返回,并将其他对象嵌套在其中。
具体来说,我有一个ApplicationForm对象,其中包含1到许多Section对象。该Section对象又可以包含1到许多Question对象。
我已经成功地将Section映射到ApplicationForm,但是对Question对象却遇到了麻烦,因为他们需要根据它们的section_id属性映射到正确的Sections。
class ApplicationFormAPI(ApplicationFormMixin, restful.Resource):
question_fields = {
'id': fields.Integer,
'type': fields.String,
'description': fields.String,
'order': fields.Integer
}
section_fields = {
'id': fields.Integer,
'name': fields.String,
'description': fields.String,
'order': fields.Integer,
'questions': fields.List(fields.Nested(question_fields))
}
form_fields = {
'id': fields.Integer,
'event_id': fields.Integer,
'is_open': fields.Boolean,
'deadline': fields.DateTime,
'sections': fields.List(fields.Nested(section_fields))
}
@marshal_with(form_fields)
def get(self):
req_parser = reqparse.RequestParser()
req_parser.add_argument('event_id', type=int, required=True, help = 'Invalid event_id requested. Event_id\'s should be of type int.')
args = req_parser.parse_args()
form = db.session.query(ApplicationForm).filter(ApplicationForm.event_id == args['event_id']).first()
sections = db.session.query(Section).filter(Section.application_form_id == form.id) #All sections in our form
questions = db.session.query(Question).filter(Question.application_form_id == form.id) #All questions in our form
form.sections = sections
#Need to bind the sections with their relevant questions
for s in form.sections:
sec_questions = []
for q in questions:
if(q.section_id == s.id):
sec_questions.append(q)
s.questions = sec_questions
if form:
return form
else:
return EVENT_NOT_FOUND
我在响应对象中将问题归为“空”。
{
"deadline": "Sun, 24 Mar 2019 00:00:00 -0000",
"event_id": 1,
"id": 1,
"is_open": true,
"sections": [
{
"description": "Personal biographical info",
"id": 1,
"name": "Personal Details",
"order": 1,
"questions": null
},
{
"description": "What do you do",
"id": 2,
"name": "Career Info",
"order": 2,
"questions": null
},
{
"description": "Everything else",
"id": 3,
"name": "Misc Info",
"order": 3,
"questions": null
}
]
}
答案 0 :(得分:0)
此行似乎不正确。问题嵌套在您的“部分”字段中,您引用的表单ID可能会导致空查询或错误数据。
questions = db.session.query(Question).filter(Question.application_form_id == form.id)
如果这不是问题,那么在本节的新迭代中,您可以尝试执行另一个查询。所以:
questions = db.session.query(Question).filter(Question.id == s.id)
这有助于减少if的负担,但会增加数据库的负载。
答案 1 :(得分:0)
我通过在本节和问题查询的末尾添加.all()解决了该问题:
sections = db.session.query(Section).filter(Section.application_form_id == form.id).all() #All sections in our form
questions = db.session.query(Question).filter(Question.application_form_id == form.id).all() #All questions in our form
不确定为什么能解决问题,但确实可以。