更新时Peewee异步意外关键字

时间:2017-10-10 22:59:59

标签: python asynchronous peewee

使用peewee async时,尝试更新对象时出错:

Traceback (most recent call last):
  File "./src/models/module.py", line 74, in run
    await self._stage_alert_attach(target_alert)
  File "./src/models/module.py", line 293, in _stage_alert_attach
    await target_alert.attach(unattached_issues)
  File "./src/models/alert.py", line 127, in attach
    await issue.attach(self)
  File "./src/models/issue.py", line 81, in attach
    await self.async_save()
  File "./src/models/base.py", line 40, in async_save
    return await self._manager.update(self, only=self.dirty_fields)
  File "/usr/local/lib/python3.6/site-packages/peewee_async.py", line 227, in update
    query = obj.update(**field_dict).where(obj._pk_expr())
TypeError: update() got an unexpected keyword argument 'alert_id'

我无法弄清楚发生了什么,因为该字段是在基类中定义的:

class BaseIssue(BaseModel):
    # Database fields
    id = peewee.PrimaryKeyField()
    module_id = peewee.IntegerField()
    model = peewee.CharField(index=True)
    model_id = peewee.CharField(index=True)
    status = peewee.CharField(index=True)
    metadata = JSONField()
    alert_id = peewee.IntegerField(null=True)
    created_at = peewee.DateTimeField(default=datetime.datetime.now)
    solved_at = peewee.DateTimeField(null=True)
    expired_at = peewee.DateTimeField(null=True)

    class Meta:
        def db_table_func(model_cls): return "Issues"

还尝试使用alert代替alert_id并将其用作外键,但遇到了相同的错误(现在使用alert关键字)。

我认为继承可能存在问题,因为继承此基类是为了创建将再次继承的DefaultIssue类。出于某种原因,update()方法不期望此参数。

以下是__dict__电话之前的对象self.async_save()和字段的打印件:

>>> obj.__dict__

{
  "_data": {
    "created_at": datetime.datetime(2017, 10, 10, 17, 6, 8, 47075),
    "id": 2,
    "module_id": 3,
    "model": "transaction",
    "model_id": "23765771",
    "status": "active",
    "metadata": {
      "transaction_id": 23765771,
      "boleto_url": None,
      "boleto_barcode": None
    },
    "alert_id": None,
    "solved_at": None,
    "expired_at": None
  },
  "_dirty": set(),
  "_obj_cache": {},
  "_logger": <Logger Issue 2 (INFO)>
}

>>> obj._meta.fields

{
  "id": <peewee.PrimaryKeyField object at 0x7f49fdb2e198>,
  "module_id": <peewee.IntegerField object at 0x7f49fdb2e3c8>,
  "model": <peewee.CharField object at 0x7f49fdb2e710>,
  "model_id": <peewee.CharField object at 0x7f49fdb2e7f0>,
  "status": <peewee.CharField object at 0x7f49fdb2e860>,
  "metadata": <playhouse.postgres_ext.JSONField object at 0x7f49fdb2e8d0>,
  "alert_id": <peewee.IntegerField object at 0x7f49fdb2e940>,
  "created_at": <peewee.DateTimeField object at 0x7f49fdb2e9b0>,
  "solved_at": <peewee.DateTimeField object at 0x7f49fdb2ea20>,
  "expired_at": <peewee.DateTimeField object at 0x7f49fdb2ea90>
}

如果我能提供更多信息,请询问。我不知道该怎么办了。

1 个答案:

答案 0 :(得分:0)

好的,我真傻。刚注意到我已经覆盖了更新方法。