Я использую flask, WTForms и SQLAlchemy для редактирования базы данных через веб-страницу. У меня есть таблица для отношения многих ко многим между элементами и задачами. Модель для этой таблицы выглядит следующим образом:
class tasks_elements(db.Model):
id = db.Column(db.Integer, primary_key=True)
tasks_id = db.Column(db.Integer(), db.ForeignKey('tasks.id'))
elements_id = db.Column(db.Integer(), db.ForeignKey('elements.id'))
На странице «Задача» я использую это для извлечения взаимосвязей для конкретной задачи:
taskellist = tasks_elements.query.filter_by(tasks_id=Id)
На Форма, в которой пользователи ставят флажки рядом с элементами, которые они хотят связать с задачей. Мне нужен этот список, чтобы отразить ассоциации и чтобы элементы можно было выбирать и удалять. Я заполняю выбранные элементы перед их добавлением в форму следующим образом:
thisItem = tasks.query.filter_by(id=Id).first()
ellist = elements.query.with_entities(elements.id, elements.description, elements.host).order_by(elements.description)
thisItem.elCheck = []
for check in taskellist:
for el in ellist:
if el.id == check.elements_id:
thisItem.elCheck.append(el.id)
Затем проверяю форму после отправки и добавляю или удаляю по мере необходимости:
for i in form.elCheck.data:
p = 0
for q in taskellist:
if i == q.elements_id:
p += 1
if p == 0:
newTaskEl = tasks_elements(tasks_id=Id, elements_id=i)
db.session.add(newTaskEl)
for o in taskellist:
a = 0
for w in form.elCheck.data:
if o.elements_id == w:
a += 1
if a == 0:
db.session.delete(o)
Это работает как предполагалось, но это кажется ужасно неэффективным, и я чувствую, что упускаю что-то, что должно сделать это более кратким, как будто я открываю банку не с того конца.
Вопрос: это правильный способ сделать это для многих для многих отношений, или есть лучший способ?