每个建筑物都有单位,每个单位都与一个帐户相关联。可能有许多与单位相关的帐户。每个单元只能有一个帐户,状态为"活动"。
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')),
})
答案 0 :(得分:1)
在询问某人(我不确定是否希望我宣传它是谁)之后
他回答如下:
这实际上是一个很好的例子,为什么我倾向于不使用 处理API有效负载的扩展。你迟早会发现 你需要的东西不是直接支持的,你最终会拥有 创建妥协解决方案。
在您的情况下我会做的是在您的模型中定义一个@property 也许叫做active_account。这将实现为 数据库查询,返回您想要单个的一个帐户 出。然后,您可以将“active_account”添加到您的架构中,以便这样做 Flask-RESTful将其呈现为相关项目。
希望这有帮助。
我认为这是一个很好的答案,它解决了我的问题。
然后我跟进:
当你说:“为什么我倾向于你时,我不太确定你所指的是什么 更喜欢不使用扩展来处理API有效负载。“
您指的是哪个分机。你到底想做什么? 在不使用“扩展”的情况下实现我的目标
他回答说:
您使用的是Flask-RESTful,这是我所指的扩展名。 我真的没有反对Flask-RESTful,效果很好,但我更喜欢 在直接烧瓶中编写我的API。
这就是所有人,也许是后来我发布了如何实施他所说的话。