редактирование SelectMultipleField с уже существующими данными в базе данных - PullRequest
0 голосов
/ 17 декабря 2018

Я создаю приложение для колб.У меня есть сообщения и теги.При создании сообщения можно выбрать много тегов для сообщения (как и здесь, переполнение стека).Проблема теперь в том, где пост будет редактироваться.Из-за ранее существующих значений, я получаю sqlalchemy.exc.IntegrityError из-за повторяющихся записей.Я попытался удалить дубликаты записей перед фиксацией в базу данных с помощью

post.tags = list(set(post.tags.all()))

, но это все равно приводит к той же ошибке.Вот функция просмотра для редактирования сообщения:

@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
    post = Post.query.get_or_404(id)
    if current_user != post.author and not current_user.can(Permission.ADMINISTER):
        abort(403)
    form = PostForm()
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    if form.validate_on_submit():
        post.body = form.body.data
        for id in form.tag.data:
            post.tags.append(Tag.query.get(id))
        db.session.commit()
        return redirect(url_for('.view_post', id=post.id))
    form.body.data = post.body
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    form.tag.data = post.tags.all()
    return render_template('home/edit_post.html', form=form, title='Edit Post')

Пожалуйста, помогите мне решить эту проблему или посоветуйте мне лучшую логику в этом.Считай меня новичком.

1 Ответ

0 голосов
/ 17 декабря 2018

После многочисленных испытаний я смог успешно выполнить редактирование.Итак, сначала я запросил фильтрацию всех категорий в этой таблице с помощью идентификатора записи (возвращает список кортежей), например [(62, 1), (62, 4)].Кортеж (post_id, tag_id).

categories = db.Table('categories', db.Column('post_id', db.Integer, db.ForeignKey('posts.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), primary_key=True))

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

Вот новая функция просмотра:

@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
    post = Post.query.get_or_404(id)
    if current_user != post.author and not current_user.can(Permission.ADMINISTER):
        abort(403)

    form = PostForm()
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]

    if form.validate_on_submit():
        post.body = form.body.data
        # query the post-tag relationship for this post id
        posttags = db.session.query(categories).filter_by(post_id=id).all()
        for id in form.tag.data:
            # custom tuple
            if (post.id, id) not in posttags:
                post.tags.append(Tag.query.get(id))
        db.session.commit()
        return redirect(url_for('.view_post', id=post.id))

    form.body.data = post.body
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    form.tag.data = post.tags.all()
    return render_template('home/edit_post.html', form=form, title='Edit Post')
...