Вам необходимо удалить метод __init__
из ваших моделей, в этом нет необходимости.
Обратите внимание, как мы никогда не определяли метод init в классе User?Это потому, что SQLAlchemy добавляет неявный конструктор ко всем классам модели, который принимает аргументы ключевого слова для всех своих столбцов и отношений.Если вы по какой-либо причине решите переопределить конструктор, обязательно продолжайте принимать ** kwargs и вызывайте супер-конструктор с этими ** kwargs, чтобы сохранить это поведение:
С определенным методом __init__
вы получаете TypeError
class User(db.Model):
def __init__(self,name):
self.name = name
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True)
env = db.relationship('Env', backref='env')
class Env(db.Model):
def __init__(self, name, user_id):
self.name = name
self.user_id = user_id
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
>>> from app import *
>>> u1 = User()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'
>>> e1 = Env()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'name' and 'user_id'
>>>
Лучший способ определить ваши модели показан в документации
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True)
env = db.relationship('Env', backref='env')
class Env(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
>>> from app import db, User, Env
>>> u1 = User()
>>> u1.name = 'user'
>>> db.session.add(u1)
>>> db.session.commit()
>>> env1 = Env()
>>> env1.name='env'
>>> env1.user_id=u1.id)
>>> db.session.add(env1)
>>> db.session.commit()
>>> env1
<Env 1>