所以我不太明白到底是什么问题。我正在使用python flask,目前正在尝试从我的Post模型调用某些帖子。但是,我总是得到这个“peewee.操作错误:near“AS”:syntax error“错误消息,由我的用户模型中的以下类方法引起:
@classmethod
def get_stream(self):
return Post.select().where(Post.user == self)
我在下面的路径中调用此方法来定义流,然后将其传递给模板:
^{pr2}$使用当前注释的行,它工作得很好,但是没有它,我得到了错误。所以这肯定是个问题
有人知道问题是什么吗?在
以下是用户和Post模型供参考:
class User(UserMixin, Model):
username = CharField(unique=True)
email = CharField(unique=True)
password = CharField(max_length=100)
joined_at = DateTimeField(default=datetime.datetime.now)
is_admin = BooleanField(default=False)
class Meta:
database = USER_DB
order_by = ('joined_at',)
@classmethod
def get_stream(self):
return Post.select().where(Post.user == self)
@classmethod
def create_user(cls, username, email, password, admin=False):
try:
with USER_DB.transaction():
cls.create(
username=username,
email=email,
password=generate_password_hash(password),
is_admin=admin)
except IntegrityError:
raise ValueError("User already exists.")
class Post(Model):
timestamp = DateTimeField(default=datetime.datetime.now)
user = ForeignKeyField(
rel_model=User,
related_name='posts'
)
content = TextField()
class Meta:
database = USER_DB
order_by = ('-timestamp',)
回溯(最近一次呼叫)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/SuperMario/Desktop/treehouse/flask_track/simple_app.py", line 49, in stream
return render_template(template, stream=stream, user=user)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/jinja2/environment.py", line 989, in render
return self.environment.handle_exception(exc_info, True)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/jinja2/environment.py", line 754, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/jinja2/_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "/Users/SuperMario/Desktop/treehouse/flask_track/templates/user_stream.html", line 1, in top-level template code
{% extends "stream.html" %}
File "/Users/SuperMario/Desktop/treehouse/flask_track/templates/stream.html", line 1, in top-level template code
{% extends "layout.html" %}
File "/Users/SuperMario/Desktop/treehouse/flask_track/templates/layout.html", line 25, in top-level template code
{% block content %} {% endblock %}
File "/Users/SuperMario/Desktop/treehouse/flask_track/templates/user_stream.html", line 26, in block "content"
{{ super() }}
File "/Users/SuperMario/Desktop/treehouse/flask_track/templates/stream.html", line 5, in block "content"
{% for post in stream %}
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 2866, in __iter__
return iter(self.execute())
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 2859, in execute
self._qr = ResultWrapper(model_class, self._execute(), query_meta)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 2555, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 3366, in execute_sql
Open an interactive python shell in this frameself.commit()
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 3212, in __exit__
reraise(new_type, new_type(*exc_args), traceback)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 125, in reraise
raise value.with_traceback(tb)
File "/Users/SuperMario/Desktop/treehouse/treehouse_flask_track/lib/python3.4/site-packages/peewee.py", line 3359, in execute_sql
cursor.execute(sql, params or ())
在我的
User
模型中定义方法之前,@classmethod
阻止了它的工作。我还是要弄清楚原因,但现在它起作用了。在用
@classmethod
装饰方法会告诉Python传递类而不是实例作为第一个参数。通常,在这种情况下,您将第一个参数命名为cls
,以保持清晰。在您的方法正在尝试从中调用它的用户实例获取所有
Post
,但是调用该方法会传递User
类。删除@classmethod
装饰器。在现在
self
是一个用户实例,并且Post.user == self
之间的关系是有意义的。在相关问题 更多 >
编程相关推荐