无法使用 marshal_with 获取整个对象列表

问题描述 投票:0回答:1

我正在尝试从数据库中获取所有对象的列表,为此我使用以下逻辑来获取员工模型页面中的所有结果:

class Employees(db.Model):
    ___tablename___ = "employees"

    emp_no = db.Column(db.Integer, primary_key=True)
    birth_date = db.Column(db.Date)
    first_name = db.Column(db.String())
    last_name = db.Column(db.String())
    gender = db.Column(db.Enum(GenderChoices, values_callable=lambda x: [str(member.value)
                                                                         for member in GenderChoices]))

    hire_date = db.Column(db.DateTime)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    last_updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)

def return_all(cls):
    def to_json(x):
        return {
            'employee_id': x.emp_no,
            'employee_name': x.first_name + " " + x.last_name,
            'gender': x.gender,
            'birth_date': x.birth_date,
            'hire_date': x.hire_date,
            'created_at': x.created_at.strftime("%Y-%m-%d %H:%M:%S"),
            'last_updated_at': x.last_updated_at.strftime("%Y-%m-%d %H:%M:%S")
        }
    return {'Employees': list(map(lambda x: to_json(x), Employees.query.all()))}

对于端点逻辑,我使用以下逻辑:

GET_EMPLOYEE = {
        'data': fields.Nested({
            'employee_id': fields.Integer,
            'employee_name': fields.String,
            'gender': fields.String,
            'birth_date': fields.String,
            'hire_date': fields.String,
            'created_at': fields.Raw,
            'last_updated_at': fields.Raw
        })
    }

class GetAllEmployees(Resource):
    @marshal_with(GET_EMPLOYEE)
    def get(self):
        return Employees.return_all()

到达终点后,我没有得到列表,而是得到空值的单个响应,如下所示:

{
    "data": {
        "employee_id": 0,
        "employee_name": null,
        "gender": null,
        "birth_date": null,
        "hire_date": null,
        "created_at": null,
        "last_updated_at": null
    }
}

可能出现什么问题?

python flask flask-sqlalchemy flask-restful
1个回答
0
投票

好吧,过了一会儿,我发现我必须改变我的

marshal_with
fields
,所以我做了一些改变..

GET_ALL_EMPLOYEE = {
        'Employees': fields.Nested({
            'employee_id': fields.Integer,
            'employee_name': fields.String,
            'gender': fields.String,
            'birth_date': fields.String,
            'hire_date': fields.String,
            'created_at': fields.Raw,
            'last_updated_at': fields.Raw
        })
    }

并且它相应地起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.