我正在构建一个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/

10-16 21:35