为什么我会收到此错误 AttributeError: 'SQLAlchemy' object has no attribute 'models'

时间:2021-05-06 03:29:09

标签: python sqlalchemy flask-sqlalchemy

嗨,我的朋友,我是烧瓶新手。我的 models.py 有问题,尤其是关系和 foreignkey - 我收到此错误:

sp_id = db.Column(db.Integer, db.models.ForeignKey('salesperson.id'), nullable=False)

AttributeError: 'SQLAlchemy' object has no attribute 'models'

所有带有 db.models.Foreignkey 的行都会引发此错误。希望你能在这里帮助我。

这是我的 models.py

的脚本
from datetime import datetime
from sqlalchemy.orm import backref
from main import db, login_manager
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):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    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.png')
    password= db.Column(db.String(60), nullable=False)
    role=db.Column(db.String(50), nullable=False, default='User')
    is_admin = db.Column(db.Boolean, default=False)
    projects = db.relationship('Project', backref='author', lazy=True)
    def __repr__(self):
        return f"User('{self.username}','{self.email}','{self.image_file}')"


class Person(db.Model):
    __abstract__=True
    id = db.Column(db.Integer, primary_key=True, nullable = False)
    lastname = db.Column(db.String(50), nullable=False)
    firstname = db.Column(db.String(50), nullable=False)
    middlename = db.Column(db.String(50), nullable =True)
    dateofbirth = db.Column(db.DateTime, nullable=False)
    gender = db.Column(db.String(10), nullable=False)
    civilstatus = db.Column(db.String(20), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    contact = db.Column(db.String(20), nullable = False)
    perm_address=db.Column(db.String(150), nullable = False)
    present_Address =db.Column(db.String(150), nullable=False)
    spouse_name = db.Column(db.String(100), nullable = False)
    education = db.Column(db.String(50), nullable = False)
    sourceofincome = db.Column(db.String(50), nullable=False)
    estimatedincome = db.Column(db.String(100), nullable=False)
    company_name = db.Column(db.String(150), nullable=False)
    company_address = db.Column(db.String(150), nullable=False)
    company_contact = db.Column(db.String(50), nullable=False)
    posted_by = db.Column(db.Integer, db.ForeignKey('user.id'),nullable=False)
    date_posted= db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    
    def __repr__(self):
        return f"Person('{self.firstname}','{self.lastname}','{self.email}')"

class SalesPerson(Person):
    __tablename__='salesperson'
    id = db.Column(db.Integer, primary_key=True, nullable = False)
    designation = db.Column(db.String(30), nullable=False)
    realty=db.Column(db.String(150), nullable=False)
    client = db.relationship('Customer',backref=db.backref('salesperson', lazy='dynamic'))

class Customer(Person):
    __tablename__='customer'
    id = db.Column(db.Integer, primary_key=True, nullable = False)
    sp_id = db.Column(db.Integer, db.models.ForeignKey('salesperson.id'),nullable=False)
    owner = db.relationship('Product', backref=db.backref('buyer', lazy="dynamic" ))

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    name = db.Column(db.String(60), unique=True, nullable=False)
    description = db.Column(db.Text, nullable=False)
    price = db.Column(db.Float, nullable=False)
    project = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False)
    owned_by = db.Column(db.Integer, db.models.ForeignKey('buyer.id'), nullable=False)
    
    def __repr__(self):
        return f"Product('{self.name}','{self.description}')"
class Project(db.Model):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    name = db.Column(db.String(60), unique=True, nullable=False)
    category = db.Column(db.String(50), nullable=False)
    location = db.Column(db.String(60), nullable=False)
    description = db.Column(db.Text, nullable=False)
    owner = db.Column(db.String(60), nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.png')
    date_posted= db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'),nullable=False)
    products = db.Relationship('Product', backref='product', lazy=True)
    def __repr__(self):
        return f"Project('{self.name}','{self.location}','{self.description}','{self.category}','{self.date_posted}')"

1 个答案:

答案 0 :(得分:0)

我所做的是将 db.models.ForeighnKey() 更改为 db.ForeighnKey()。现在它抛出一个新错误:

>     D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\flask_sqlalchemy\__init__.py:873:
> FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant
> overhead and will be disabled by default in the future.  Set it to
> True or False to suppress this warning.
>       'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>       File "D:\FLASK_PROPERTYMANAGEMENT\main\__init__.py", line 16, in <module>
>         from main import routes
>       File "D:\FLASK_PROPERTYMANAGEMENT\main\routes.py", line 7, in <module>
>         from main.form import RegistrationForm, LoginForm, UpdateAccountForm, ProjectForm
>       File "D:\FLASK_PROPERTYMANAGEMENT\main\form.py", line 7, in <module>
>         from main.models import User
>       File "D:\FLASK_PROPERTYMANAGEMENT\main\models.py", line 54, in <module>
>         class SalesPerson(Person):
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\flask_sqlalchemy\model.py", line 67, in __init__
>         super(NameMetaMixin, cls).__init__(name, bases, d)
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\flask_sqlalchemy\model.py", line 121, in __init__
>         super(BindMetaMixin, cls).__init__(name, bases, d)
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_api.py",
> line 75, in __init__
>         _as_declarative(reg, cls, dict_)
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_base.py",
> line 126, in _as_declarative
>         return _MapperConfig.setup_mapping(registry, cls, dict_, None, {})
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_base.py",
> line 177, in setup_mapping
>         return cfg_cls(registry, cls_, dict_, table, mapper_kw)
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_base.py",
> line 299, in __init__
>         self._scan_attributes()
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_base.py",
> line 455, in _scan_attributes
>         local_attributes_for_class, attribute_is_overridden
>       File "D:\FLASK_PROPERTYMANAGEMENT\venv\lib\site-packages\sqlalchemy\orm\decl_base.py",
> line 621, in _produce_column_copies
>         "Columns with foreign keys to other columns "
>     sqlalchemy.exc.InvalidRequestError: Columns with foreign keys to other columns must be declared as @declared_attr callables on
> declarative mixin classes.  For dataclass field() objects, use a
> lambda:.