WTForms-SQLAlchemy Дочерняя запись отношений один-ко-многим не обновляется - PullRequest
0 голосов
/ 23 октября 2018

Я столкнулся с проблемой при создании формы для вставки и обновления записи базы данных 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» не обновляется.каждый раз создается новый ряд.Если я отправляю три раза, у меня есть одна строка в таблице «Клиент» и три строки в «ВВПР», только та, которая связана с таблицей «Клиент».

...