简体   繁体   English

Python flask_sqlalchemy: AttributeError: 'Table' object 没有属性 ' added_by'

[英]Python flask_sqlalchemy: AttributeError: 'Table' object has no attribute 'added_by'

Here is my model class, which has definition of all database objects.这是我的 model class,它定义了所有数据库对象。 (I've imported db object from another package which is an instance of sqlAlchemy()) (我已经从另一个 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)

I use another class to create these objects and query data as following我使用另一个 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() works fine and it creates all the schema objects with correct relationship, however querying the data gives error. create_all() 工作正常,它创建具有正确关系的所有模式对象,但是查询数据会出错。 (ie running above code gives error as below) AttributeError: 'Table' object has no attribute 'added_by' Why am I getting this error? (即运行上面的代码给出如下错误) 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'

I managed to solve this.我设法解决了这个问题。 Apparently I was mixing up class names and table names, here is the working updated code, look at the updated foreign key data for 'added_by' column.显然我混淆了 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.

相关问题 flask_sqlalchemy AttributeError: &#39;list&#39; 对象没有属性 &#39;topic1&#39; - flask_sqlalchemy AttributeError: 'list' object has no attribute 'topic1' AttributeError: 'Table' object 在 flask sqlalchemy 关联表中没有属性 'table' - AttributeError: 'Table' object has no attribute 'table' in flask sqlalchemy association table Flask 中的 SQLAlchemy - AttributeError: 'Table' object 没有属性 'author' - SQLAlchemy in Flask - AttributeError: 'Table' object has no attribute 'author' SQLAlchemy:AttributeError:“表”对象没有属性“ id” - SQLAlchemy: AttributeError: 'Table' object has no attribute 'id' Flask SQLAlchemy AttributeError:&#39;NoneType&#39;对象没有属性&#39;append&#39; - Flask SQLAlchemy AttributeError: 'NoneType' object has no attribute 'append' Flask-sqlalchemy AttributeError: 'function' object 没有属性 'query' - Flask-sqlalchemy AttributeError: 'function' object has no attribute 'query' AttributeError:使用Flask SqlAlchemy,“ tuple”对象没有属性“ drivername” - AttributeError: 'tuple' object has no attribute 'drivername' using Flask SqlAlchemy Flask-SQLalchemy AttributeError: 'NoneType' object 没有属性 "" - Flask-SQLalchemy AttributeError: 'NoneType' object has no attribute "" Python在查询SQLAlchemy关联表时返回AttributeError(&#39;function&#39;对象没有属性&#39;c&#39;) - Python returns AttributeError when querying a SQLAlchemy association table ('function' object has no attribute 'c') python sqlalchemy AttributeError: 'BaseQuery' object 没有属性 'id' - python sqlalchemy AttributeError: 'BaseQuery' object has no attribute 'id'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM