如何使用Flask-RestPlus中的fields.list限制返回的内容

时间:2017-11-09 16:33:56

标签: python flask flask-restplus

每个建筑物都有单位,每个单位都与一个帐户相关联。可能有许多与单位相关的帐户。每个单元只能有一个帐户,状态为"活动"。

API会返回所有单位的列表,并且每个单位中嵌套的是所有与该单位相关联的帐户的列表。

如何返回相同的单位列表,但只返回与每个单位相关联的有效帐户?

#model.py

class Unit(db.Model):
    __tablename__ = 'units'
    ...
    building_id = db.Column(db.Integer, db.ForeignKey('buildings.id'))
    building = db.relationship("Building", back_populates="units")
    accounts = db.relationship("Account", back_populates="unit")

class Account(db.Model):
    __tablename__ = 'accounts'
    id = db.Column(db.Integer, primary_key=True)
    status = db.Column(sqlalchemy_utils.ChoiceType(STATUS_CHOICES))
    ...

#building.py

@api.route('/units')
class BuildingUnits(Resource):
    @api.marshal_with(schemas.unit_fields, envelope='data')
    def get(self):
        """ Get list of all units
        """
        return rbac.current_identity.building.units

#schemas.py

unit_fields = api.model('unit_fields', {
    'id': fields.String,
    ...etc
    ...etc
    'accounts': fields.List(fields.Nested(account_fields)),
})

account_fields = api.model('account_fields', {
    'id': fields.String,
    ...etc
    ...etc
    'status': fields.String(attribute=lambda x: getattr(x.status, 'value', 'Inactive')),
})

1 个答案:

答案 0 :(得分:1)

在询问某人(我不确定是否希望我宣传它是谁)之后

他回答如下:

  

这实际上是一个很好的例子,为什么我倾向于不使用   处理API有效负载的扩展。你迟早会发现   你需要的东西不是直接支持的,你最终会拥有   创建妥协解决方案。

     

在您的情况下我会做的是在您的模型中定义一个@property   也许叫做active_account。这将实现为   数据库查询,返回您想要单个的一个帐户   出。然后,您可以将“active_account”添加到您的架构中,以便这样做   Flask-RESTful将其呈现为相关项目。

     

希望这有帮助。

我认为这是一个很好的答案,它解决了我的问题。

然后我跟进:

  

当你说:“为什么我倾向于你时,我不太确定你所指的是什么   更喜欢不使用扩展来处理API有效负载。“

     

您指的是哪个分机。你到底想做什么?   在不使用“扩展”的情况下实现我的目标

他回答说:

  

您使用的是Flask-RESTful,这是我所指的扩展名。   我真的没有反对Flask-RESTful,效果很好,但我更喜欢   在直接烧瓶中编写我的API。

这就是所有人,也许是后来我发布了如何实施他所说的话。