2016-01-22 79 views
1

所以我不太明白这里的问题究竟是什么。我正在使用python-flask,目前正在尝试从我的Post模型调用某些帖子。不过,我总是得到这个“peewee.OperationalError:近‘AS’:语法错误”,这是由下面的类方法在我的用户模型造成的错误消息:peewee.OperationalError:接近“AS”:语法错误

@classmethod 
    def get_stream(self): 
     return Post.select().where(Post.user == self) 

我拨打以下路线此方法定义数据流,然后将其传递给模板:

@app.route('/stream') 
@app.route('/stream/<username>') 
def stream(username=None): 
    template = 'stream.html' 
    if username and username != current_user.username: 
     user = social.User.select().where(social.User.username**username).get() 
     stream = user.posts.limit(100) 
    else: 
     stream = current_user.get_stream().limit(100) 
     user = current_user 
    if username: 
     template = "user_stream.html" 
# stream = social.Post.select().where(social.Post.user == current_user.id) 
    return render_template(template, stream=stream, user=user) 

使用当前注释只是正常的路线,但没有它,我得到的错误。所以这肯定是一个问题

任何人的想法是什么问题是?

仅供参考,这里的用户和后型号:

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()) 
+0

请显示完整的错误信息和回溯。 –

+0

完成。希望能帮助到你! – fakechek

+0

这似乎不是完整的信息;哪里有关语法错误的地方? –

回答

3

使用@classmethod修饰方法会告诉Python传递类而不是实例作为第一个参数。通常,在这种情况下,您将第一个参数cls命名为保持清楚。

你的方法试图让所有的Posts与它被调用的用户实例相关,但是调用该方法通过User类。删除@classmethod修饰符。

def get_stream(self): 
    return Post.select().where(Post.user == self) 

现在self是用户实例,以及关系Post.user == self是有道理的。

+0

感谢您的解释! – fakechek

1

@classmethod在我User模型定义方法之前阻止它的工作。我仍然必须弄清楚为什么,但现在它起作用了。

+0

您可以接受您自己的答案。 – Rafael

+0

它在2天内说... – fakechek