我在数据库中有一个CustomerOrders
表,它有一个orders
列,存储用户的订单,首先这是我的表和我用于orders
列的数据类型(我遵循教程)
class JsonEncodedDict(db.TypeDecorator):
impl = db.Text
def process_bind_param(self, value, dialect):
if value is None:
return '{}'
else:
return json.dumps(value)
def process_result_value(self, value, dialect):
if value is None:
return {}
else:
return json.loads(value)
class CustomerOrder(db.Model):
id = db.Column(db.Integer, primary_key=True)
invoice = db.Column(db.String(20), unique=True, nullable=False)
status = db.Column(db.String(20), default='Pending', nullable=False)
customer_id = db.Column(db.Integer, db.ForeignKey(
'customers.id'), nullable=False)
customer = db.relationship('Customers', back_populates='orders')
date = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
orders = db.Column(JsonEncodedDict)
并且如何按顺序存储数据的示例如下所示:
{"1": {"file": null, "image": "fd42dbf4212ddfd8c76b.png", "name": "p1", "price": "6.00", "quantity": "3"},
"2": {"file": null, "image": "52556d918e2e490032c0.jpg", "name": "p2", "price": "3.00", "quantity": "3"}}
在我的例子中,客户支付订单后,他可以为每个产品上传一个文件,我想在保存后将orders
中的file
更新为上传的文件名,但我面临一个问题,数据库中的数据不会更新,并且保持不变,我尝试使用以下方法:
@app.route('/upload_file/<int:code>', methods=['POST', 'GET'])
@login_required
def upload_file(code):
if request.method == 'POST':
file = request.files.get('order_file')
invoice = request.args.get('invoice')
order = CustomerOrder.query.filter_by(invoice=invoice).first()
try:
file_name = secrets.token_hex(10) + '.pdf'
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_name))
data = {}
for key, item in order.orders.items():
existing_data = item
if int(key) == code:
existing_data['file'] = file_name
data[str(key)] = existing_data
order.orders = data
db.session.commit()
flash(
f'{item["name"]}\'s file has been uploaded.', 'success')
return redirect(url_for('orders'))
except Exception as e:
print(e)
return redirect(url_for('orders'))
在此代码中,数据库中的orders
被更新,但仅更新到具有上传文件的产品,因此如果订单在为其中一个上传文件后有3个项目,则订单现在只有1个项目,因此我将代码修改为:
try:
file_name = secrets.token_hex(10) + '.pdf'
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_name))
data = {}
for key, item in order.orders.items():
existing_data = item
if int(key) == code:
existing_data['file'] = file_name
data[str(key)] = existing_data
order.orders = data
db.session.commit()
flash(
f'{item["name"]}\'s file has been uploaded.', 'success')
return redirect(url_for('orders'))
但是现在数据库根本没有改变,它保持不变,我已经试着解决它2天了,什么都不起作用,想过改变我在数据库中存储orders
的整个方式,但是如果我这样做,我也需要改变很多东西,所以我在做之前在这里做最后一次尝试。
1条答案
按热度按时间j13ufse21#
请储存,而订单作为表没有它,你会有麻烦,无论如何在功能。
如果没有!我的建议是你可以保存它而不使用for循环,就像这样: