将Flask-SQLAlchemy中的模型分离到另一个文件会破坏PyDev导入检测

时间:2014-02-15 19:33:56

标签: python flask pydev flask-sqlalchemy

我正在学习Flask,当我尝试将我的应用程序分离到更多模块时,没有明显的理由PyDev开始报告Undefined variable from import。但是,代码仍然有效。

首先,我首先将flask添加到Forced Builtins中,以便PyDev动态地解析扩展。这样PyDev就不会报告flask.ext...个导入。

这个设置一切都很好:

模板/ index.py

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>Test</title>
</head>
<body>
    <ul>
    {% for user in all_users %}
      <li>{{ user.username }}</li>
    {% endfor %}
    </ul>
</body>
</html>

main_old.py

from flask import Flask, render_template
from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username="", email=""):
        self.username = username
        self.email = email  

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///test.db"
db.init_app(app)

@app.route("/")
def hello():
    db.drop_all()
    db.create_all()
    db.session.add(User("John Doe", "john.doe@example.com"))
    db.session.add(User("Bill Smith", "smith.bill@example.com"))
    db.session.commit()
    all_users = User.query.all()
    return render_template('index.html', all_users=all_users)

if __name__ == "__main__":
    app.run(debug=True)

现在我将 main_old.py 分成 main.py models.py ,如下所示:

models.py

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username="", email=""):
        self.username = username
        self.email = email

main.py

from flask import Flask, render_template
from models import db, User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///test.db"
db.init_app(app)

@app.route("/")
def hello():
    db.drop_all()
    db.create_all()
    db.session.add(User("John Doe", "john.doe@example.com"))
    db.session.add(User("Bill Smith", "smith.bill@example.com"))
    db.session.commit()
    all_users = User.query.all()
    return render_template('index.html', all_users=all_users)

if __name__ == "__main__":
    app.run(debug=True)

它是等效的,但我在Undefined variable from import: query行上获得了all_users = User.query.all()。 为什么PyDev导入检测会像这样破坏?为什么它在一个文件中工作?有没有办法来解决这个问题?是否有@UndefinedVariable以外的解决方法?

1 个答案:

答案 0 :(得分:1)

我仍然不知道为什么会发生这种情况,但存在解决方法。

使用推荐的all_users = db.session.query(User).all()代替all_users = User.all()