如何在Python中嵌套多对多对象?

时间:2019-02-07 10:22:35

标签: python json flask sqlalchemy

我要从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
        }
    ]
}

2 个答案:

答案 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        

不确定为什么能解决问题,但确实可以。