在peewee模型中动态定义类的名称

时间:2014-09-07 10:42:06

标签: mysql python-2.7 peewee

我正在尝试使用字符串动态分配类名。

很像这样......

classname='cats'

class classname(peewee.Model):

Peewee似乎认为我不应该这样做,而且我在寻找一种动态定义类名的方法时遇到了很多麻烦。

帮助!

3 个答案:

答案 0 :(得分:11)

如果您需要控制表名,您可以执行以下操作:

 class MyModel(Model):
     whatever = CharField()

     class Meta:
         db_table = 'my_table_name'

答案 1 :(得分:1)

我遇到了同样的问题,最后找到了解决方案。 也许动态定义peewee模型中的类名称并不是一个好主意。

class Person(Model):
    name = CharField()
    birthday = DateField()
    is_relative = BooleanField()

    class Meta:
        database = db
        db_table = "Hello"

>>> Person.__dict__
mappingproxy({'DoesNotExist': <class 'peewee.PersonDoesNotExist'>,       'is_relative': <peewee.FieldDescriptor object at 0x000000000470BEF0>, 'name': <peewee.FieldDescriptor object at 0x000000000470BF60>, '_meta': <peewee.ModelOptions object at 0x000000000470BE48>, 'birthday': <peewee.FieldDescriptor object at 0x000000000470BF98>, 'id': <peewee.FieldDescriptor object at 0x000000000470BEB8>, '__module__': 'data', '_data': None, '__doc__': None})

您可以清楚地看到元类在 __ dict __ 中的含义,您可以通过以下方式更改它:

 setattr(Person._meta, "db_table", "another")

 db.connect()
 db.create_table(Person)

我不是英语母语人士和编程新手,但我希望这个解决方案对你有所帮助。

答案 2 :(得分:0)

使用&#34; exec&#34;函数是最简单的方法:

CLASS_TEMPLATE = """\
class %s(peeww.Model):
    pass
"""

classname = "cats"
exec(CLASS_TEMPLATE % classname)

c = cats()   # works !

说明:

我创建了一个名为CLASS_TEMPLATE的字符串,其中包含创建类的Python代码。我使用格式说明符%s作为类名,因此可以替换它。

这样做:

CLASS_TEMPLATE % "cats"

替换格式说明符%s并创建一个字符串,其中包含用于创建名为&#34; cats&#34;的类的代码。

如果您要求Python执行此代码,则会定义您的类:

exec(CLASS_TEMPLATE % "cats")

您可以看到它存在于您的命名空间中:

>>> globals()
{..., 'cats': <class __main__.cats at 0x1007b9b48>, ...}

......而且这是一个班级:

>>> type(cats)
<type 'classobj'>

您可以开始使用这个新定义的类来实例化对象:

c = cats()