代码之家  ›  专栏  ›  技术社区  ›  Matthew Moisen

Pewee-在运行时确定模型的元数据

  •  2
  • Matthew Moisen  · 技术社区  · 11 年前
    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 回复  |  直到 11 年前
        1
  •  4
  •   coleifer    11 年前

    你可以的 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>}
    
        2
  •  0
  •   jpmc26    11 年前
    >>> 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 持有。请注意,我们正在对 食品 直接键入对象,从中获取此信息 变量。

    一旦我们有了所有的字段,我们就可以对它们进行循环并检查列名和类型。很可能,你会想要一些 isinstance 检查 field 找出要在HTML中使用的类型。我想你会想过滤掉或忽略 PrimaryKeyField 但我想你能弄明白。

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