Есть ли встроенный метод для отношений «многие ко многим» с Flask, SQLAlchemy и WTForms - PullRequest
1 голос
/ 07 января 2020

Я использую 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)

Это работает как предполагалось, но это кажется ужасно неэффективным, и я чувствую, что упускаю что-то, что должно сделать это более кратким, как будто я открываю банку не с того конца.

Вопрос: это правильный способ сделать это для многих для многих отношений, или есть лучший способ?

...