Flask SQLAlchemy 仅更新 2 个模型之间的 link

Flask SQLAlchemy update only the link between 2 models

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

{
"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 尝试创建函数,但我只想在 table“link_item_function”中创建 link,而不是功能。而如果函数不存在,return 报错。我到处看,但没有成功。 有没有好的方法来做到这一点? 我希望 SQLAlchemy 包中直接有这个解决方案。

预先感谢您的帮助!

经过几天几个月的研究,我通过这个 question and the official documentation !

找到了“associationproxy”的解决方案