python - 如何在 SQLAlchemy 中实现未知/可选字段,用户可以在其中添加自己的新字段?

标签 python database sqlalchemy

我正在使用 Sqlalchemy 编写一个 python 程序,它存储某些内容的条目,但我想让用户添加自己的字段。

这是我目前的模型,使用 Python 3 和 Sqlalchemy

class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('folders.id'),     nullable=True)
    name = Column(String(128))
    key = Column(String(256))
    value = Column(String(512))
    extras = Column(Binary)
    next_scheduled = Column(DateTime)
    new = Column(Integer)

我应该如何为用户添加自己的字段提供功能?

最佳答案

我会这样做:

创建两个新表,一张用于字段,一张用于答案。使答案成为问题(用户定义字段)和原始项目的子项。用户可以通过向字段表中添加行来添加字段,并且您可以在拉取原始项目时检索所有自定义字段的答案:

class CustomField(Base):
    __tablename__ = 'custom_fields'
    id = Column(Integer, primary_key=True)
    name = Column(String(128)) # internal name in this case
    title = Column(Text) # Text of field label

class CustomResponse(Base):
    __tablename__ = 'custom_responses'
    id = Column(Integer, primary_key=True)
    item_id = Column(Integer, ForeignKey('items.id'))
    item = relationship('Item', backref='custom_responses')
    custom_field_id = Column(Integer, ForeignKey('custom_fields.id'))
    custom_field = relationship('CustomField') # put backref here if needed
    value = Column(Text) # Actual answer

您甚至可以通过在 custom_fields 表上放置 widget = Column(...) 列或任何其他选项/说明来为用于绘制表单的任何内容提供说明。如果您希望每个自定义字段仅可用于一项,请在 CustomField 模型上复制 item_id 列和 item 关系。

尝试将所有数据强制放在一行上是没有意义的;让 sqlalchemy 处理关系。在这种情况下,您可以通过关系获取所有自定义字段问题和答案:

如果i = Item(),则i.custom_responses将返回与该项目关联的所有已完成的CustomResponse对象的列表,并且对于每个custom_response,您可以通过 custom_response.custom_field 获取问题。

关于python - 如何在 SQLAlchemy 中实现未知/可选字段,用户可以在其中添加自己的新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736647/

相关文章:

python - 将字符串变量作为 Python 属性传递

python - Selenium Python - 访问搜索结果的下一页

java - 是否可以从其字节数组内容中找到图像文件扩展名?

python - Flask-SQLAlchemy Postgres 错误 - 无法连接到服务器 : Connection refused (0x0000274D/10061)

python - 多重继承调用顺序

python - Pandas - 按值按索引合并行到新列

c# - 使用 C# 访问 OpenERP

database - 您会将二进制数据存储在数据库还是文件系统中?

python - 在 sqlalchemy 中提供模型类级别的验证

python - SQLAlchemy 将 UTF-8 作为 Latin1 字符串返回