首页 > 解决方案 > Flask SQLAlchemy 仅更新 2 个模型之间的链接

问题描述

我在 python 3.7 中使用 Flask、SQLAlchemy、Marshmallow 开发了一个 API。我尝试通过表格链接修改与许多功能相关的这个对象“项目”,反之亦然。

{
"id": "0fef2a90-f468-4e8e-827d-3d1804cb3ad5",
"name": "item 1",
"functions": [],
}

我想在第 1 项中添加一个现有功能:

{
"id": "0fef2a90-f468-4e8e-827d-3d1804cb3ad5",
"name": "item 1",
"functions": [{
    "id": "35f56892-2154-4f11-8af5-6a13b1456fc4",
    "name": "function 1"
 }],
}

这是我的模型和模式的代码:

class ItemModel(db.Model):
    __tablename__ = 'item'

    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
    name = db.Column(db.Text, unique=True, nullable=False)

    functions = db.relationship('FunctionModel', secondary='link_item_function', uselist=True)


class FunctionModel(db.Model):
    __tablename__ = 'function'

    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
    name = db.Column(db.Text, unique=True, nullable=False)
    description = db.Column(db.Text)

    items = db.relationship('ItemModel', secondary='link_item_function', uselist=True)


class LinkItemFunctionModel(db.Model):
    __tablename__ = 'link_item_function'

    function_id = db.Column(UUID(as_uuid=True), db.ForeignKey('function.id', ondelete='CASCADE'))
    item_id = db.Column(UUID(as_uuid=True), db.ForeignKey('item.id', ondelete='CASCADE'))

    link_item_function_pkey = db.PrimaryKeyConstraint(function_id, item_id)


from ma import ma

class FunctionSchema(ma.SQLAlchemyAutoSchema):

    items = ma.Nested('ItemSchema', many=True, exclude=('functions',))
    class Meta:
        model = FunctionModel
        load_instance = True
        transient = True


class ItemSchema(ma.SQLAlchemyAutoSchema):

    functions = ma.Nested('FunctionSchema', many=True, exclude=('items',))
    class Meta:
        model = ItemModel
        load_instance = True

当我这样做时,我的 API 会尝试创建函数,但我只想在表“link_item_function”中创建链接,而不是函数。如果该函数不存在,则返回错误。我到处寻找,但没有成功。有没有好的方法来做到这一点?我想在 SQLAlchemy 包中直接有这个解决方案。

提前感谢您的帮助!

标签: pythonflasksqlalchemymany-to-many

解决方案


经过几天和几个月的研究,我通过这个问题官方文档找到了“associationproxy”的解决方案!


推荐阅读