@Lepilov

Flask-WTF: как сохранить модель со связью One-to-Many в базу данных?

Есть две модели Datacener и Server с общей связью ForeigKey, при попытке создать новую модель Server, форма не проходит валидацию. При выводе в шаблон form.errors - получаю "Datacener: Not a valid choice".

class Datacener(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        server = db.relationship('Server', backref='datacener', lazy=True)
        tier = db.Column(db.Integer)
        ...

    class Server(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        os = db.Column(db.String(64))
        ...
        datacener_id=db.Column(db.Integer, db.ForeignKey('datacener.id'), nullable=False)



    @app.route('/add_server', methods = ['POST', 'GET'])
    @login_required
    def add_server():
        form = ServerForm(request.form)
        if request.method=='POST' and form.validate():
            data = Server(
                    number=form.number.data,
                    name=form.name.data,
                    factory=form.factory.data,
                    model=form.model.data,
                    serial=form.serial.data,
                    os=form.os.data,
                    datacener_id=form.datacener_id.data        
                              )
            db.session.add(data)
            db.session.commit()
            flash('Server created successfully!')
            return redirect('/')

        return render_template('new_server.html', form=form)

class ServerForm(FlaskForm):

    number = IntegerField('Number')   
    name = StringField('Name')
    factory = StringField('Factory')
    model = StringField('Model')
    serial = IntegerField('Serial')
    os = StringField('OS')
    datacener_id = SelectField('Datacener', choices=[(x.id, x.name) for x in db.session.query(Datacener).all()])

В django связи работают легко и непринужденно, здесь же я лопачу интернет уже который час и не могу найти толкового описания по связанным моделям, хотя задача по идее обыденная. Очень нужна помощь.

Еще попробовал такой вариант формы

class ServerForm(FlaskForm):

    number = IntegerField('Number')   
    name = StringField('Name')
    factory = StringField('Factory')
    model = StringField('Model')
    serial = IntegerField('Serial')
    os = StringField('OS')
    datacener_id = SelectField()
    #datacener_id = SelectField('Datacener', choices=[(x.id, x.name) for x in db.session.query(Datacener).all()])

    def __init__(self, *args, **kwargs):

        self.datacener_id.kwargs['choices'] = [(x.id, x.name) for x in db.session.query(Datacener).all()]
        FlaskForm.__init__(self, *args, **kwargs)


С ним немного изменился вывод form.errors - получаю "Datacener Id: Not a valid choice".
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 1
planc
@planc

В django связи работают легко и непринужденно, здесь же я лопачу интернет уже который час


ох уж этот мерзкий фласк :D

Datacener

db.session.query(Datacener).all()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы