3

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

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')),
})
4

1 回答 1

2

在问过某人(我不确定要我宣传谁)之后

他回应如下:

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

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

希望这可以帮助。

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

然后我跟进:

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

你指的是哪个扩展。在不使用“扩展”的情况下,你究竟会做什么来实现我所拥有的

他回答说:

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

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

于 2017-11-09T21:37:32.353 回答