如何在flask_restful中使用marshal_with来获取可能属于不同类型的属性

时间:2015-08-19 21:26:39

标签: marshalling flask-restful

我正在使用flask_restful.marshal_with来清理我的实体:

class Domain(db.Model):

    __tablename__ = 'domain'

    id = db.Column(db.BigInteger, primary_key=True)
    domain_name = db.Column(db.String(253), unique=True)
    user_id = db.Column(db.BigInteger, db.ForeignKey('user.id'), nullable=True)
    .... # bunch of other sensitive fields I don't want to output

这是我的处理程序:

class Domains(Resource):
    domain_fields = {
        'id': fields.Integer,
        'user_id': fields.Integer,
        'domain_name': fields.String
        }

    @marshal_with(domain_fields)
    def get(self, domain_id):
        """return domain details"""
        entity = domain.Domain.query.get(domain_id)

        return entity 

user_id属性可以是None或Integer。

设置domain_fields以输出Bool或Int而不仅限于Int?这是一个很好的发言权?

2 个答案:

答案 0 :(得分:1)

如果user_id为None,您可以在user_id中放置一个默认值,或者您可以为user_id创建一个自定义字段以便正确处理。

domain_fields = {
    'id': fields.Integer,
    'user_id': fields.Integer(default=False),
    'domain_name': fields.String
}

class CustomField(fields.Raw):
    def output(self, key, obj):
        return obj.user_id or False

domain_fields = {
    'id': fields.Integer,
    'user_id': CustomField,
    'domain_name': fields.String
}

答案 1 :(得分:0)

没有一种方法可以让1个字段成为2种数据类型。事实上,我强烈建议不要这样做。坚持使用Int。

以下是我的方法:

class Domains(Resource):
    def __init__(self):
        self.domain_fields = {
            'id': fields.Integer,
            'user_id': fields.Integer,
            'domain_name': fields.String
        }

    def get(self, domain_id):
        """return domain details"""
        entity = domain.Domain.query.get(domain_id)
        return marshal(entity, self.domain_fields), 200

如果设置了这将返回user_id作为int,如果它是None,则响应将为null,这对于JSON Int字段有效。

marshal()返回的示例响应: 如果user_id = integer:

{"id": 1234, "user_id": 1, "domain_name": "example.com"}

如果user_id =无:

{"id": 1234, "user_id": null, "domain_name": "example.com"}