[英]Peewee: dynamically set table_name when model is instanced
我很確定這不是重復的。 我知道我們可以使用以下方法“動態”設置表名:
class DBmodel(Model)
class Meta:
database = db
table_name = "foobar"
但是,如果我想在每次實例DBmodel
時更改table_name
怎么辦?
例如考慮這個工作片段:
#!/usr/bin/env python3
# coding: utf-8
from peewee import *
conf = {
"foo": {
"foo1": "CharField(null=True)",
"foo2": "CharField(null=True)"
},
"bar": {
"bar1": "CharField(null=True)",
"bar2": "CharField(null=True)"
}
}
db = SqliteDatabase("foobar.db")
class DBmodel(Model):
class Meta:
database = db
table_name = "foobar"
class Data:
def __init__(self, conf):
self.conf = conf
self.DBmodel = DBmodel()
for entry in self.conf:
# I have to use eval because my conf is actually coming from parsed json, where I can only have text field
self.DBmodel._meta.add_field(entry, eval(self.conf[entry]))
if __name__ == "__main__":
dataFoo = Data(conf["foo"])
dataBar = Data(conf["bar"])
dataFoo.DBmodel.create_table()
dataBar.DBmodel.create_table()
所以我得到:
$ sqlite3 foobar.db
SQLite version 3.22.0 2018-01-22 18:45:57
sqlite> .schema foobar
CREATE TABLE IF NOT EXISTS "foobar" ("id" INTEGER NOT NULL PRIMARY KEY, "foo1" VARCHAR(255), "foo2" VARCHAR(255), "bar1" VARCHAR(255), "bar2" VARCHAR(255));
但我想要兩個這樣的表:
$ sqlite3 foobar.db
SQLite version 3.22.0 2018-01-22 18:45:57
sqlite> .schema foo
CREATE TABLE IF NOT EXISTS "foo" ("id" INTEGER NOT NULL PRIMARY KEY, "foo1" VARCHAR(255), "foo2" VARCHAR(255));
sqlite> .schema bar
CREATE TABLE IF NOT EXISTS "bar" ("id" INTEGER NOT NULL PRIMARY KEY, "bar1" VARCHAR(255), "bar2" VARCHAR(255));
當然,我可以每次都復制我的DBmodel
並更改table_name
,但這看起來很難看。 有更好的解決方案嗎?
您始終可以使用內置type
動態聲明類:
attrs = {
'foo': TextField(),
'bar': TextField(),
}
MyModel = type('MyModel', (BaseModel,), attrs)
為什么你的“數據”必須是一個類? 大概您需要的只是一個接受配置字典鍵的函數,並且您將返回一個新的類對象。 你可能想考慮一下。
我還要指出,這樣做是一個壞主意。
# coding: utf-8
from peewee import *
db = SqliteDatabase("foobar.db")
def get_table_name(model_class):
return model_class.__name__
def class_generator(class_name):
value_dict = {}
for i in range(2):
value_dict['{}{}'.format(class_name, i+1)] = CharField(null=True)
value_dict['Meta'] = type('Meta', (object, ), {'database': db, 'table_function': get_table_name})
return type(class_name, (Model, ), value_dict)
if __name__ == "__main__":
dataFoo = class_generator("foo")
dataBar = class_generator("bar")
dataFoo.create_table()
dataBar.create_table()
DBmodel._meta.set_table_name(<table_name>)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.