sqlalchemy удалить функцию проблема, я хочу удалить один элемент, но он на самом деле удаляет всю категорию? - PullRequest
0 голосов
/ 09 сентября 2018

это моя ссылка на github

Я использую sqlalchemy для этого проекта.

Все, кроме функции удаления, хорошо работает для CRUD.

просто интересно, что случилось?

# Edit the specific item
@app.route('/catalog/<int:categories_id>/<int:items_id>/edit',
           methods=['GET', 'POST'])
@login_required
def editItem(categories_id, items_id):
    editedItem = session.query(CategoryItem).filter_by(id=items_id).one()
...
    if request.method == 'POST':
...
        session.add(editedItem)
        session.commit()
        flash("item edited successfully!")
        return redirect(url_for('showItem', categories_id=categories_id,
                                items_id=items_id))
    else:
        return render_template('edititem.html', categories_id=categories_id,
                               items_id=items_id, item=editedItem)


# Delete the specific item
@app.route('/catalog/<int:categories_id>/<int:items_id>/delete',
           methods=['GET', 'POST'])
@login_required
def deleteItem(categories_id, items_id):
    itemToDelete = session.query(CategoryItem).filter_by(id=items_id).one()
...
    if request.method == 'POST':
        session.delete(itemToDelete)
        session.commit()
        flash("item deleted successfully!")
        return redirect(url_for('showCategories', categories_id=categories_id))
    else:
        return render_template('deleteitem.html', categories_id=categories_id,
                               items_id=items_id, item=itemToDelete)

как вы можете видеть в коде.

И editedItem, и deleteItem используют session.query (CategoryItem) .filter_by (id = items_id) .one ()

Но когда я удаляю предмет.

вместо того, чтобы удалить один элемент, вся категория была удалена.

Пожалуйста, смотрите шаблон ниже

<form action="{{url_for('deleteItem' ,categories_id=categories_id, items_id=items_id, item=itemToDelete)}}" method="POST">&nbsp
  <input type="submit" value ="Delete">
  <a href = "{{url_for('showItem',categories_id=categories_id, items_id=items_id)}}"><button type="button">Cancel</button></a>

Я не уверен, что вызвало эту проблему.

1 Ответ

0 голосов
/ 09 сентября 2018

Это потому, что вы установили свои отношения с каскадом delete-orphan.

class Categories(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship(User)

    @property
    def serialize(self):
        return {
            'name': self.name,
            'id': self.id,
        }


class CategoryItem(Base):
    __tablename__ = 'category_item'
    name = Column(String(80), nullable=False)
    id = Column(Integer, primary_key=True)
    description = Column(String(250))
    categories_id = Column(Integer, ForeignKey('categories.id'))
    categories = relationship(Categories, cascade="all, delete-orphan",
                              single_parent=True)
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship(User)

    @property
    def serialize(self):
        return {
            'name': self.name,
            'description': self.description,
            'id': self.id,
        }

Ваша таблица CategoryItem является родительской таблицей. Вы устанавливаете отношения внутри него с категориями как дочерний объект. Если у вас есть cascage='delete-orphan', это включает каскадные удаления, но с дополнительным поведением (вы можете прочитать об этом здесь: http://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete)

Попробуйте удалить delete-orphan из вашего каскадного аргумента

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