Как реализовать неизвестные / необязательные поля в SQLAlchemy, где пользователь может добавлять свои новые поля? - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу программу на Python, также использующую Sqlalchemy, в которой для чего-то хранится запись, но я хотел бы позволить пользователю добавлять свои собственные поля.

Вот моя модель на данный момент, с использованием 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)

Как я должен идти о функциональности для пользователя, добавляя свои собственные поля?

1 Ответ

0 голосов
/ 18 февраля 2019

Вот как я бы это сделал:

Создайте две новые таблицы, одну для полей и одну для ответов.Сделайте ответ дочерним как для вопроса (пользовательское поле), так и для исходного элемента.Пользователи могут добавлять поля, добавляя строки в таблицу полей, и вы можете получать ответы на все настраиваемые поля всякий раз, когда извлекаете исходный элемент:

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

Вы можете даже предоставить инструкции для всего, что вы используете длянарисуйте форму, поместив столбец widget = Column(...) в таблицу custom_fields или любые другие параметры / инструкции.Если вы хотите, чтобы каждое настраиваемое поле было доступно только одному элементу, дублируйте столбец item_id и отношение item в модели CustomField.

Нет смысла пытаться принудительно поместить все данные в одну строку;пусть sqlalchemy позаботится об отношениях.В этом случае вы можете получить все вопросы и ответы по настраиваемым полям через отношения:

Если i = Item(), то i.custom_responses вернет список всех завершенных объектов CustomResponse, связанных с этим элементом, и для каждого custom_response, вы можете получить вопрос с custom_response.custom_field.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...