我正在使用 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/