Peewee - 在运行时确定有关模型的元数据

时间:2014-03-22 04:42:20

标签: python peewee

class Foo(Model):
    bar = CharField()
    baz = CharField()
    class Meta:
        database = db

<body>
    Create a new Foo:
    <input type="text" name="bar" />
    <input type="text" name="baz" />
</body>

我希望能够在运行时确定模型中字段的名称,数据类型和其他元数据,并将它们传递给html模板,而不是对html中的输入字段进行硬编码。循环过来。

2 个答案:

答案 0 :(得分:3)

你可以Model._meta.fields

In [1]: from peewee import *

In [2]: class User(Model):
   ...:     username = CharField()
   ...:     

In [3]: User._meta.fields
Out[3]: 
{'id': <peewee.PrimaryKeyField at 0x2eba290>,
 'username': <peewee.CharField at 0x2eb4e10>}

答案 1 :(得分:0)

>>> x = [v for k,v in vars(Foo).items() if isinstance(v, peewee.FieldDescriptor)]
>>> for i in x:
...     print(i.att_name, i.field)
...
('bar', <peewee.CharField object at 0x022AC810>)
('baz', <peewee.CharField object at 0x022AC6B0>)
('id', <peewee.PrimaryKeyField object at 0x022B4CD0>)

这利用了Python内置vars生成类FieldDescriptor所拥有的Foo个对象的列表。请注意,我们直接对Foo类型对象进行操作,从 class 变量中获取此信息。

一旦我们拥有了所有字段,我们就可以遍历它们并检查列名称和类型。最有可能的是,您需要对isinstance进行某种field检查,以确定要在HTML中使用的类型。我想你会过滤掉或忽略PrimaryKeyField,但我认为你可以解决这个问题。

但是,我会提醒你不要这样做。简单地维护HTML中的字段列表可能会更好。是的,这有点麻烦,但自动在HTML页面中出现新列并不一定是好事。