gpt4 book ai didi

python - (flask)-sqlalchemy查询,必须导入所有模型

转载 作者:行者123 更新时间:2023-12-02 23:06:41 27 4
gpt4 key购买 nike

我在使用 Flask 和 Flask-SQLAlchemy 时遇到问题,对于任何查询,我都需要导入所有相关模型。

现在我的 auth.views.py 看起来像这样(编程的前几行所以只是一个测试 View )

from flask import jsonify                                                   

from . import auth
from app.models.user import User


@auth.route('/', methods=['GET'])
def index():
users = User.query.all()
return jsonify({'name': users[0].name})

现在我收到错误

“InvalidRequestError:初始化映射器Mapper|User|user时,表达式'Course'无法找到名称(“名称'Course'未定义”)。如果这是一个类名,请考虑将此relationship()添加到定义两个依赖类之后的类。”

我有一个项目,其中有一个像这样的模型包

app                                                                         
├── auth
│ ├── __init__.py
│ └── views.py
├── __init__.py
└── models
├── assignment.py
├── base.py
├── client.py
├── course.py
├── __init__.py
├── submission.py
└── user.py

我的用户类与类(class)有多对多,与提交有一对多。

这是通过导入类(class)(然后提交,然后是其中的关系,最终基本上是所有模型)来解决的。

在 Pyramid 项目中,我们也使用 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

最佳答案

如果您确实想坚持每个类一个文件的方案,在我看来,更干净的选择是在模型包的 init 中进行导入:

models/__init__.py:

from user import User
from client import Client
from course import Course
# plus your remaining classes

然后您可以将类导入为

from models import User

这使得事情更具可读性,并且允许将每个类一个文件的方案与包含多个类的模块混合,同时仍然能够从模型中以“平面”方式导入所有类.

关于python - (flask)-sqlalchemy查询,必须导入所有模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29217076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com