peewee 引用了一个不存在的基 class table

peewee refers to a base class table that does not exist

以下设置说明了我的问题:

from peewee import (Model, 
                    SqliteDatabase)
from peewee import (CharField,
                    ForeignKeyField,
                    IntegerField)

from playhouse.shortcuts import model_to_dict

database = SqliteDatabase(':memory:')

class BaseModel(Model):

    class Meta:
        database = database

class Description(BaseModel):
    i_am = CharField(
        db_column='I_AM'
        )
    class Meta:
        db_table = 'DESCRIPTION'

# This is not a table, just a convenient class to inherit from.
class ValueBase(BaseModel):
    value = IntegerField(
        db_column='VALUE'
        )
    description = ForeignKeyField(
        db_column='I_AM_ID',
        rel_model=Description,
        to_field='id'
        )

class SpecificValue(ValueBase):

    class Meta:
        db_table = 'SPECIFIC_VALUE'

if __name__ == '__main__':

    models = [Description, SpecificValue]
    database.create_tables(models)

    description = Description(
        i_am = 'prime'
        )
    description.save()

    specific = SpecificValue(
        value=7,
        description=description
        )
    specific.save()

    ### This works 
    print model_to_dict(
        specific
        )
    ### This does NOT work
    print model_to_dict(
        specific,
        backrefs=True
        )

问题是当我使用 model_to_dict 并请求反向引用时,函数认为 specific 在 table valuebase 而不是 table 称为 SPECIFIC_VALUE。有谁知道如何进行这种继承并正确设置 table 名称?

编辑

回溯如下:

Traceback (most recent call last):
  File "/home/lafras/Projects/Cloud/eg.py", line 61, in <module>
    backrefs=True
  File "build/bdist.linux-x86_64/egg/playhouse/shortcuts.py", line 96, in model_to_dict
  File "build/bdist.linux-x86_64/egg/playhouse/shortcuts.py", line 117, in model_to_dict
  File "build/bdist.linux-x86_64/egg/peewee.py", line 2794, in __iter__
  File "build/bdist.linux-x86_64/egg/peewee.py", line 2787, in execute
  File "build/bdist.linux-x86_64/egg/peewee.py", line 2470, in _execute
  File "build/bdist.linux-x86_64/egg/peewee.py", line 3199, in execute_sql
  File "build/bdist.linux-x86_64/egg/peewee.py", line 3048, in __exit__
  File "build/bdist.linux-x86_64/egg/peewee.py", line 3191, in execute_sql
peewee.OperationalError: no such table: valuebase

如果SpecificValue直接继承自BaseModel

class SpecificValue(BaseModel):
    value = IntegerField(
        db_column='VALUE'
        )
    description = ForeignKeyField(
        db_column='I_AM_ID',
        rel_model=Description,
        to_field='id'
        )

    class Meta:
        db_table = 'SPECIFIC_VALUE'

然后输出符合预期:

{'id': 1, 'value': 7, 'description': {'id': 1, 'i_am': 'prime'}}

你能更彻底地解释一下哪里不正常吗?我没有看到任何与 SpecificValue table 关联的反向引用,因为没有 other 模型具有外键。

编辑:

好的,所以这里发生的事情是,当您指定 backrefs 时,peewee 正试图从:

SpecificValue -> Description -> ValueBase(有一个外键来描述)。

解决方法是显式排除 backref:

model_to_dict(specific, backrefs=True, exclude=[Description.valuebase_set])