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”的解决方案
我在 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”的解决方案