我正在构建一个Flask API,并试图学习如何从1-n关系中加载父模型的属性。
首先,我加载所有库存项目。这很好。我的目标是加载每个库存项目的父模型(材料)名称属性。
只是为了清理事物,物料中有许多库存物料。库存项目属于物料。我有所有库存物品的集合。
我的目标是这样的:
{'id': 1, 'location': None, 'material_name': {'name': 'load name'}
但是我从不加载名称,它返回空白:
{'id': 1, 'location': None, 'material_name': {'name': ''}
我正在使用棉花糖创建一个flask-api并返回漂亮的JSON。
这是我的模型
from app import db
from marshmallow import Schema, fields
class Material(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), index=True, unique=False)
items = db.relationship('Inventory', backref='material', lazy='dynamic')
class Inventory(db.Model):
id = db.Column(db.Integer, primary_key=True)
location = db.Column(db.Integer, primary_key=False)
material_id = db.Column(db.Integer, db.ForeignKey('material.id'))
def __init__(self, material_name):
self.material_name = material_name
##### SCHEMAS (marshmallow) #####
# http://marshmallow.readthedocs.org/en/latest/examples.html
class MaterialSchema(Schema):
id = fields.Int(dump_only=True)
name = fields.Str()
class InventorySchema(Schema):
id = fields.Int(dump_only=True)
location = fields.Int(dump_only=True)
material_name = fields.Nested(MaterialSchema, only=["name"])
和我的查询:
inventory_schema = InventorySchema(many=True)
@api.route('/api/inventory', methods=['GET'])
@cross_origin()
def inventoryindex():
d=request.args['q']
if len(d) >= 1:
search_term = "%{0}%".format(d)
count = Inventory.query.filter(Inventory.location.like(search_term)).count
items = Inventory.query.filter(Inventory.location.like(search_term)).limit(10)
else:
count = Inventory.query.count()
items = Inventory.query.limit(10)
result = inventory_schema.dump(items)
print(result)
dictionary = {}
for obj in result[0]:
dictionary[obj['id']] = obj
return jsonify({'dict':dictionary})
它返回我期望的所有内容,但材质名称为空。如何从上面的库存查询中加载物料ID?
最佳答案
解决方案1
为什么首先要具有这样的功能。 item['material_name']['name']
看起来像name
的重复两次。
IMO最好的解决方案是将格式更改为:
{'id': 1, 'location': None, 'material': {'name': 'load name'}
比您可以更改架构以加载材料名称:
class InventorySchema(Schema):
id = fields.Int(dump_only=True)
location = fields.Int(dump_only=True)
material = fields.Nested(MaterialSchema, only=["name"])
解决方案2
如果您坚持要求格式,则可以通过传递
InventorySchema
参数来更改attribute
以从正确的属性获取值:class InventorySchema(Schema):
id = fields.Int(dump_only=True)
location = fields.Int(dump_only=True)
material_name = fields.Nested(MaterialSchema, attribute='material', only=["name"])
关于python - 使用SQLalchemy和棉花糖加载一对多关联属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32386842/