嗨,我的朋友,我是烧瓶新手。我的 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}')"
答案 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:.