Я столкнулся с проблемой при создании формы для вставки и обновления записи базы данных SQLAlchemy, которая имеет отношение «один ко многим».В базе данных дочерняя запись не обновляется.Каждый раз, когда я отправляю, в «GDPR» создается новая запись.Вот код:
from flask_wtf import FlaskForm
from wtforms import StringField, validators
from wtforms.validators import DataRequired
from wtforms.fields import FormField
from wtforms_alchemy import ModelForm, ModelFieldList
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, render_template, url_for, redirect, request
app = Flask(__name__)
app.secret_key = 'top_secret'
# SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///C:\\Users\\OMISTAJA\\Documents\\dev\\python\\sandbox\\WTF_SQL\\db\\user.db'
db = SQLAlchemy(app)
#[Start Model]
class Customer(db.Model):
__tablename__ = 'customer'
id = db.Column(db.Integer, primary_key=True)
created_on = db.Column(db.DateTime, server_default=db.func.now())
updated_on = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())
lastname = db.Column(db.String(56))
firstnames = db.Column(db.String(56))
hid = db.Column(db.String(16))
phone = db.Column(db.String(16))
email = db.Column(db.String(56))
addressI = db.Column(db.String(56))
addressII = db.Column(db.String(56))
city = db.Column(db.String(56))
zip_code = db.Column(db.Integer)
gdprs = db.relationship('GDPR')
class GDPR(db.Model):
__tablename__ = 'gdpr'
id = db.Column(db.Integer, primary_key=True)
is_active = db.Column('active', db.Boolean )
parent_id = db.Column(db.Integer, db.ForeignKey('customer.id'))
startdate = db.Column('start', db.DateTime, nullable=False)
enddate = db.Column('end', db.DateTime, nullable=True) # how long should be ??
desc = db.Column('info', db.String(160))
class GDPRForm(ModelForm):
class Meta:
model = GDPR
class CustomerForm(ModelForm):
class Meta:
model = Customer
gdprs = ModelFieldList(FormField(GDPRForm))
#[END Model]
@app.route('/customer/', methods=('GET', 'POST'))
def customer():
myobj = Customer(gdprs=[GDPR()])
form = CustomerForm(request.form, obj=myobj)
if request.method == 'POST':
form.populate_obj(myobj)
db.session.add(myobj)
db.session.commit()
docid=myobj.id
print(docid)
return redirect(url_for('edit_customer', docid=docid))
backref = ('customer')
return render_template('customer.html', form=form, backref=backref)
@app.route('/customer/<docid>', methods=('GET', 'POST'))
def edit_customer(docid):
myobj = Customer.query.filter_by(id=docid).one()
form = CustomerForm(request.form, obj=myobj)
if request.method == 'POST':
form.populate_obj(myobj)
db.session.commit()
docid=myobj.id
print(docid)
backref = ('edit_customer, ', docid)
return render_template('customer.html', form=form, backref=backref)
@app.route("/reload_db")
def reload_db():
db.drop_all()
db.create_all()
return ("Data Base re-done")
if __name__ == '__main__':
app.run(debug=True)
Когда я создаю запись в БД по маршруту '/ customer /', запись создается для обеих таблиц в базе данных.Запрос в «/ customer /» работает просто отлично, но когда я нажимаю «Отправить», строка в таблице «GDPR» не обновляется.каждый раз создается новый ряд.Если я отправляю три раза, у меня есть одна строка в таблице «Клиент» и три строки в «ВВПР», только та, которая связана с таблицей «Клиент».