![](/img/trans.png)
[英]flask_sqlalchemy AttributeError: 'list' object has no attribute 'topic1'
[英]Python flask_sqlalchemy: AttributeError: 'Table' object has no attribute 'added_by'
这是我的 model class,它定义了所有数据库对象。 (我已经从另一个 package 导入了 db object,这是 sqlAlchemy() 的一个实例)
from datetime import datetime
from TasMar import db, login_manager
from flask import current_app
from flask_login import UserMixin
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User(db.Model, UserMixin):
__tablename__ = 'tm_user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20),unique=True, nullable=False)
email = db.Column(db.String(120),unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password= db.Column(db.String(120), nullable=False)
#foreign keys accessing this table's primary keys
added = db.relationship('Tasks', lazy=True, foreign_keys='tm_task.added_by')
assigned = db.relationship('Tasks', lazy=True, foreign_keys='tm_task.assigned_to')
def __repr__(self):
return "User('{}','{}','{}')".format(self.username,self.email,self.image_file)
class Tasks(db.Model):
__tablename__ = 'tm_task'
task_id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('tm_task.task_id'),nullable=True)
descr = db.Column(db.String(500), nullable=False)
added_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
added_by = db.Column(db.Integer, db.ForeignKey('tm_user.id'),nullable=False)
assigned_to = db.Column(db.Integer, db.ForeignKey('tm_user.id'),nullable=False)
last_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
remark = db.Column(db.Text)
parent = db.relationship('Tasks', remote_side=[task_id]) #self referential
status = db.Column(db.Integer, db.ForeignKey('tm_status.id'),nullable=False)
type = db.Column(db.Integer, db.ForeignKey('tm_type.id'),nullable=False)
urgency = db.Column(db.Integer, db.ForeignKey('tm_urgency.id'),nullable=False)
def __repr__(self):
return "Tasks('{}','{}','{}','{}')".format(self.descr,self.added_on,self.added_by,self.assigned_to)
class tm_status(db.Model):
__tablename__ = 'tm_status'
id = db.Column(db.Integer, primary_key=True)
status = db.Column(db.String(20),unique=True,nullable=False)
status_f = db.relationship('Tasks', lazy=True, foreign_keys='tm_task.status')
def __repr__(self):
return "tm_status('{}')".format(self.status)
class tm_type(db.Model):
__tablename__ = 'tm_type'
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String(20),unique=True,nullable=False)
type_f = db.relationship('Tasks', lazy=True, foreign_keys='tm_task.type')
def __repr__(self):
return "tm_type('{}')".format(self.type)
class tm_urgency(db.Model):
__tablename__ = 'tm_urgency'
id = db.Column(db.Integer, primary_key=True)
urgency = db.Column(db.String(20),unique=True,nullable=False)
urgency_f = db.relationship('Tasks', lazy=True, foreign_keys='tm_task.urgency')
def __repr__(self):
return "tm_urgency('{}')".format(self.urgency)
我使用另一个 class 创建这些对象并查询数据如下
from TasMar import db,create_app
from TasMar.models import User,Tasks,tm_status, tm_urgency,tm_type
app=create_app()
app.app_context().push()
#db.create_all() #<<works perfectly but not below !
user = User.query.filter_by(email='dummy@email.com').first()
print(user)
create_all() 工作正常,它创建具有正确关系的所有模式对象,但是查询数据会出错。 (即运行上面的代码给出如下错误) AttributeError: 'Table' object has no attribute ' added_by'为什么我会收到这个错误?
Traceback (most recent call last):
File "F:\My Documents\Official\work\EclipseWorkspace\TaMar\setup_db.py", line 7, in <module>
user = User.query.filter_by(email='dummy@email.com').first()
File "F:\Installations\Anaconda\lib\site-packages\flask_sqlalchemy\__init__.py", line 517, in __get__
mapper = orm.class_mapper(type)
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\base.py", line 421, in class_mapper
mapper = _inspect_mapped_class(class_, configure=configure)
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\base.py", line 400, in _inspect_mapped_class
mapper._configure_all()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\mapper.py", line 1268, in _configure_all
configure_mappers()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\mapper.py", line 3013, in configure_mappers
mapper._post_configure_properties()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\mapper.py", line 1811, in _post_configure_properties
prop.init()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\interfaces.py", line 184, in init
self.do_init()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\relationships.py", line 1655, in do_init
self._process_dependent_arguments()
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\orm\relationships.py", line 1680, in _process_dependent_arguments
setattr(self, attr, attr_value())
File "F:\Installations\Anaconda\lib\site-packages\sqlalchemy\ext\declarative\clsregistry.py", line 281, in __call__
x = eval(self.arg, globals(), self._dict)
File "<string>", line 1, in <module>
AttributeError: 'Table' object has no attribute 'added_by'
我设法解决了这个问题。 显然我混淆了 class 名称和表名,这是工作更新代码,查看“added_by”列的更新外键数据。
from datetime import datetime
from TasMar import db, login_manager
from flask import current_app
from flask_login import UserMixin
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User(db.Model, UserMixin):
__tablename__ = 'tm_user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20),unique=True, nullable=False)
email = db.Column(db.String(120),unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password= db.Column(db.String(120), nullable=False)
#foreign keys accessing this table's primary keys
added_by = db.relationship('Tasks',backref='addedby', lazy=True, foreign_keys='Tasks.added_by')
assigned_to = db.relationship('Tasks',backref='user', lazy=True, foreign_keys='Tasks.assigned_to')
def __repr__(self):
return "User('{}','{}','{}')".format(self.username,self.email,self.image_file)
class Tasks(db.Model):
__tablename__ = 'tm_task'
task_id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('tm_task.task_id'),nullable=True)
descr = db.Column(db.String(500), nullable=False)
added_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
assigned_to = db.Column(db.Integer, db.ForeignKey('tm_user.id'),nullable=False)
added_by = db.Column(db.Integer, db.ForeignKey('tm_user.id'),nullable=False)
target_date = db.Column(db.DateTime,nullable=True,default=None)
last_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
remark = db.Column(db.Text)
#foreign keys accessing this table's primary keys
parent = db.relationship('Tasks', remote_side=[task_id]) #self referential
status = db.Column(db.Integer, db.ForeignKey('tm_status.id'),nullable=False)
type = db.Column(db.Integer, db.ForeignKey('tm_type.id'),nullable=False)
urgency = db.Column(db.Integer, db.ForeignKey('tm_urgency.id'),nullable=False)
def __repr__(self):
return "Tasks('{}','{}','{}','{}')".format(self.descr,self.added_on,self.added_by,self.assigned_to)
class tm_status(db.Model):
__tablename__ = 'tm_status'
id = db.Column(db.Integer, primary_key=True)
status = db.Column(db.String(20),unique=True,nullable=False)
status_f = db.relationship('Tasks',backref='status_f', lazy=True, foreign_keys='Tasks.status')
def __repr__(self):
return "tm_status('{}')".format(self.status)
class tm_type(db.Model):
__tablename__ = 'tm_type'
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String(20),unique=True,nullable=False)
type_f = db.relationship('Tasks',backref='type_f', lazy=True, foreign_keys='Tasks.type')
def __repr__(self):
return "tm_type('{}')".format(self.type)
class tm_urgency(db.Model):
__tablename__ = 'tm_urgency'
id = db.Column(db.Integer, primary_key=True)
urgency = db.Column(db.String(20),unique=True,nullable=False)
urgency_f = db.relationship('Tasks', backref='urgency_f', lazy=True, foreign_keys='Tasks.urgency')
def __repr__(self):
return "tm_urgency('{}')".format(self.urgency)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.