Flask-Restplus使用一个类方法

时间:2017-07-14 06:40:42

标签: python flask flask-restplus

我想知道是否可以使用不属于模型一部分的字段来编组资源,这意味着它会从模型类中的方法返回数据。

例如,让我们假设这是我想要编组的模型对象(它是实际模型的简化版本)

class Program(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    location = Column(String)

    def get_students(self, **kw):
        return self._union('students', **kw)

get_students方法的功能是加入来自其他程序的几个学生列表。

所以,在我看来,我有这个:

@ns.route('/<string:id>')
@api.response(404, 'Program not found.')
class ProgramItem(Resource):

    @api.marshal_with(program_with_students)
    def get(self, id):
        """
        Returns a program with a list of students.
        """
        program = Program.query.filter(Program.id == id).one()
        return program

这是序列化器:

program_with_students = api.model('Program with students', {
    'id': fields.String(required=True, description='Program identifier'),
    'name': fields.String(required=True, description='Program name'),
    'location': fields.String(required=True, attribute='location_name', description='Program location'),
})

所以,我的问题是,我如何编组一个我想给学生打电话的字段,并返回get_students返回的方法?

一直在阅读flask-restplus,我不确定field.Raw正是我应该使用的...基本上,我不确定我可以在{{3}中引用Program对象} method ...似乎restplus只传递值而不是对主对象的引用?

编辑:找到解决方案......

只使用属性并调用lambda会使它变得如此简单:D

  'students': fields.List(fields.Nested(program_student), required=True, description='List of students on program',
                        attribute=lambda obj: obj.get_students())

仅供参考,program_student只是另一个序列化程序,因为Student也是一个模型,但现在这是无关紧要的

0 个答案:

没有答案