#python #flask #sqlalchemy #flask-sqlalchemy
#python #flask #sqlalchemy #flask-sqlalchemy
Вопрос:
Я пытаюсь удалить продукт из таблицы Product, одновременно удаляя все движения этого продукта из таблицы product movements (называемой Movement), но удаляется только продукт, а не его движения. Кто-нибудь знает почему? Это код:
@app.route('/products/<int:product_id>/delete', methods=['GET', 'POST'])
def delete_product(product_id):
product = Product.query.get_or_404(product_id)
movements = Movement.query.filter_by(product_id=product_id).all()
for movement in movements:
db.session.delete(movement)
db.session.delete(product)
db.session.commit()
flash('The product has been deleted!', 'success')
return redirect(url_for('products'))
Это модель для таблицы продуктов:
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
product_movements = db.relationship('Movement', backref='item', lazy=True)
и это для таблицы перемещений:
class Movement(db.Model):
id = db.Column(db.Integer, primary_key=True)
product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
product = db.Column(db.String(50), nullable=False)
from_location_id = db.Column(db.Integer, db.ForeignKey('location.id'))
from_location = db.Column(db.String(50))
to_location_id = db.Column(db.Integer, db.ForeignKey('location.id'))
to_location = db.Column(db.String(50))
quantity = db.Column(db.Integer, nullable=False)
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
Комментарии:
1. Это работает для меня с использованием sqlite и sqlalchemy. Возможно
Movement.product_id
, неправильно устанавливается? Вы могли бы попробовать установитьnullable=False
значение onMovement.product_id
, что предотвратило бы создание движений без продукта или удаление продуктов без удаления их движений.
Ответ №1:
Я понял, что было не так, я не установил значения для product_id в таблице перемещений.
if form.validate_on_submit():
product = Product.query.filter_by(id=form.product.data).first()
from_location = Location.query.filter_by(id=form.from_location.data).first()
to_location = Location.query.filter_by(id=form.to_location.data).first()
m = Movement(product_id = product.id, product = product.name, from_location_id = from_location.id, from_location = from_location.name, to_location_id = to_location.id, to_location = to_location.name, quantity = form.quantity.data)
db.session.add(m)
db.session.commit()
movements = Movement.query.all()
products = Product.query.all()
locations = Location.query.all()
return render_template('movements.html', movements=movements, products=products, locations=locations, form=form)
Теперь это работает.