我正在尝试使用字符串动态分配类名。
很像这样......
classname='cats'
class classname(peewee.Model):
Peewee似乎认为我不应该这样做,而且我在寻找一种动态定义类名的方法时遇到了很多麻烦。
帮助!
答案 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()