peewee是指不存在的基类表

时间:2015-07-09 14:19:20

标签: python orm peewee

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

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位于表valuebase中而不是名为SPECIFIC_VALUE的表中。有谁知道如何进行这种继承并正确设置表名?

修改

回溯如下:

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'}}

1 个答案:

答案 0 :(得分:1)

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

编辑:

好的,所以这里发生的事情是,当你指定backrefs时,peewee试图来自:

SpecificValue - &gt;说明 - &gt; ValueBase(具有描述的外键)。

修复方法是明确排除backref:

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