【问题标题】:Peewee Foreignkeyfield doesn't accept appropriate foreign key fieldPeewee Foreignkeyfield 不接受适当的外键字段
【发布时间】:2014-10-03 15:07:56
【问题描述】:

我在我的烧瓶应用程序中使用 Python Peewee ORM 作为数据库。我已经定义了一个用户和一张票,如下所示:

class Ticket(db.Model):
    created = DateTimeField(default=datetime.utcnow)
    event_id = CharField()
    owner = ForeignKeyField(User, related_name='owned_tickets')

然后我尝试按如下方式保存票:

ticket = Ticket()
ticket.event_id=request.form['eventId']
ticket.owner=g.user
ticket.save()

但我得到了一个TypeError: int() argument must be a string or a number, not 'User',上面粘贴了一个(巨大的)堆栈跟踪。奇怪的是我将字段定义为ForeignKeyField(User) 类型,但它似乎要求输入字符串/数字。

有人知道我在这里做错了什么吗?欢迎所有提示!

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Library/Python/2.7/site-packages/flask_login.py", line 758, in decorated_view
    return func(*args, **kwargs)
  File "/Users/kramer65/dev/repos/tc/app/views/webviews.py", line 120, in myTickets
    ticket.save()
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 3511, in save
    pk_from_cursor = self.insert(**field_dict).execute()
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 2565, in execute
    return self.database.last_insert_id(self._execute(), self.model_class)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 2126, in _execute
    sql, params = self.sql()
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 2556, in sql
    return self.compiler().generate_insert(self)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1530, in generate_insert
    return self.build_query(clauses, alias_map)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1359, in build_query
    return self.parse_node(Clause(*clauses), alias_map)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1320, in parse_node
    sql, params, unknown = self._parse(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1295, in _parse
    sql, params = self._parse_map[node_type](node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1248, in _parse_clause
    node.nodes, alias_map, conv, node.glue)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1337, in parse_node_list
    node_sql, node_params = self.parse_node(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1320, in parse_node
    sql, params, unknown = self._parse(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1295, in _parse
    sql, params = self._parse_map[node_type](node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1248, in _parse_clause
    node.nodes, alias_map, conv, node.glue)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1337, in parse_node_list
    node_sql, node_params = self.parse_node(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1320, in parse_node
    sql, params, unknown = self._parse(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1295, in _parse
    sql, params = self._parse_map[node_type](node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1248, in _parse_clause
    node.nodes, alias_map, conv, node.glue)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1337, in parse_node_list
    node_sql, node_params = self.parse_node(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1320, in parse_node
    sql, params, unknown = self._parse(node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1295, in _parse
    sql, params = self._parse_map[node_type](node, alias_map, conv)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1236, in _parse_param
    params = [node.conv(node.value)]
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 1052, in db_value
    return self.to_field.db_value(value)
  File "build/bdist.macosx-10.9-intel/egg/peewee.py", line 674, in db_value
    return value if value is None else self.coerce(value)
  File "/Library/Python/2.7/site-packages/werkzeug/local.py", line 390, in <lambda>
    __int__ = lambda x: int(x._get_current_object())
TypeError: int() argument must be a string or a number, not 'User'

[编辑] 好的,错误似乎位于我迄今为止发布的代码之外的其他地方。我尝试从 python 交互式解释器添加 Ticket,效果很好。当我print type(g.user) 时,我得到类型&lt;class 'werkzeug.local.LocalProxy'&gt;。这很奇怪,因为我可以简单地打印出正确的g.user.usernameg.user.passwordUser 类如下所示:

class User(relDb.Model, BaseUser):
    username = CharField()
    password = CharField()

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.id)

我将g.user对象设置如下:

@app.before_request
def before_request():
    g.user = current_user

对于为什么g.user 给出werkzeug.local.LocalProxy 而不是 User 类,是否有人有任何其他想法?欢迎所有提示!

【问题讨论】:

  • 你的用户类代码和用户数据库主键是什么?
  • 您是否尝试过to_field 参数并将其指向正确的用户类的主键字段?
  • 同上分享您的User 模型。
  • @MehdiSadeghi - 原来g.userwerkzeug.local.LocalProxy 类型而不是User 类型(请参阅我对问题的编辑)。知道这是为什么吗?
  • @coleifer - 我刚刚对我的问题进行了编辑。原来g.user 对象是werkzeug.local.LocalProxy 类型而不是User 类型。知道这是为什么吗?

标签: python database orm flask peewee


【解决方案1】:

好的,经过更多阅读后,我找到了解决方案。由于g 从不返回底层对象,而只是充当将命令传递给实际对象并返回结果的代理,因此我需要获取g.user 指向的对象,如下所示:

ticket.owner = g.user._get_current_object()

在我的 Ticket 模型中保存它就像一个魅力。

ps。由于这有效,我现在使用它。但如果这种方法有什么问题,我很想听听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多