Python (flask)-sqlalchemy查询,必须导入所有模型
我对Flask和Flask SQLAlchemy有一个问题,对于任何查询,我都需要导入所有相关的模型 现在我的auth.views.py看起来是这样的(编程这件事的前几行,所以只是一个测试视图) 现在我犯了一个错误Python (flask)-sqlalchemy查询,必须导入所有模型,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我对Flask和Flask SQLAlchemy有一个问题,对于任何查询,我都需要导入所有相关的模型 现在我的auth.views.py看起来是这样的(编程这件事的前几行,所以只是一个测试视图) 现在我犯了一个错误 无效的错误:当初始化映射器映射器用户“用户”时,表达式“当然”没有找到一个名称(“名称”当然没有定义)。如果这是类名,那么在定义了两个依赖类之后,考虑将这个关系()添加到类中。 我有一个项目,我有这样一个模型包 app
无效的错误:当初始化映射器映射器用户“用户”时,表达式“当然”没有找到一个名称(“名称”当然没有定义)。如果这是类名,那么在定义了两个依赖类之后,考虑将这个关系()添加到类中。 我有一个项目,我有这样一个模型包
app
├── auth
│ ├── __init__.py
│ └── views.py
├── __init__.py
└── models
├── assignment.py
├── base.py
├── client.py
├── course.py
├── __init__.py
├── submission.py
└── user.py
我的用户类有多对多的课程和一对多的提交
这可以通过导入课程(然后提交,然后从那里导入关系,最后基本上导入所有模型)来解决
在金字塔项目的工作中,我们也使用SQLAlchemy,但我从来不需要导入所有的模型来完成我的工作。有什么想法吗?出什么事了?我真的搞不懂这一点,也没法用谷歌搜索它
用户看起来像这样
user_course = db.Table(
'user_course', db.Model.metadata,
db.Column('student_id', UUID, db.ForeignKey('user.id'),
primary_key=True),
db.Column('course_id', UUID, db.ForeignKey('course.id'),
primary_key=True)
)
class User(db.Model):
id = db.Column(UUID, default=lambda: str(uuid.uuid4()), primary_key=True)
firstname = db.Column(db.String(100), nullable=False)
lastname = db.Column(db.String(100), nullable=False)
insertion = db.Column(db.String(15)) # tussenvoegsel
# email = db.Column(db.String, nullable=False, unique=True)
password_hash = db.Column(db.String, nullable=False)
enrolled_courses = db.relationship('Course', secondary=user_course,
backref='students')
managed_courses = db.relationship('Course', backref='teacher')
submissions = db.relationship('Submission', backref='student')
@property
def name(self):
return "{}{}{}".format(
self.firstname + " ",
self.insertion + " " if self.insertion else "",
self.lastname
)
@property
def password(self):
raise AttributeError("Password is not a readable attribute")
@password.setter
def password(self, password):
self.password_hash = bcrypt.hashpw(password, bcrypt.gensalt(12))
def verify_password(self, password):
return bcrypt.hashpw(password, self.password_hash) == \
self.password_hash
好吧,很明显,你无法绕过加载所有模块。我不想手动执行此操作,因此我在
\uu init\uuu.py
。现在,所有模块都将按照注释所说的需要执行
import inspect
import pkgutil
import importlib
import sys
def import_models():
thismodule = sys.modules[__name__]
for loader, module_name, is_pkg in pkgutil.iter_modules(
thismodule.__path__, thismodule.__name__ + '.'):
module = importlib.import_module(module_name, loader.path)
for name, _object in inspect.getmembers(module, inspect.isclass):
globals()[name] = _object
import_models()
如果你真的想坚持一个类一个文件的方案,在我看来,更干净的选择是在模型包的init中进行导入:
models/\uuuu init\uuuuu.py:
from user import User
from client import Client
from course import Course
# plus your remaining classes
然后可以将类作为
from models import User
这使内容更具可读性,并允许将每个类一个文件的方案与包含多个类的模块混合使用,同时如果您从未导入您的
模型,则仍然能够以“平面”方式从模型导入所有类。当然
模块,代码从未执行,您的课程类也从未实际创建并注册过sys.modules
。我希望我不必事先导入所有模块。每次你介绍新东西的时候,手动操作都很糟糕。我还假设wehn连接到数据库元数据将加载所有表。但是谢谢你的指点。我将在回答中给出我自己的解决方案,我的建议是将您的模型导入一个模块,而不是像那样拆分它们。当模型很小的时候这很好,但是当它们变得更大并且接收到更多的方法时,将它们分开就更可读了。至少这是我个人的感觉,可能是一种错误的感觉:)我有一个动态的解决方案,但你在可读性方面是绝对正确的。所以我最终选择了你的解决方案,这对我很有效。如果您仍然面临任何问题,请仔细查看错误消息,它会显示缺少的内容。可能是某些文件超出了模块(例如,为多个关系创建的普通表),如果是这样,请在init.py中也导入这些文件
from models import User