在Flask-MongoAlchemy中创建动态文档

时间:2012-12-13 23:11:30

标签: python flask mongoalchemy

我正在使用Flask-MongoAlchemy作为个人项目。我有一些.cfg输入文件,我想解析并制作成mongodb文档条目。不幸的是,.cfg文件是平的,我想从每个文件中创建多个不同的文档。我想在一个地方(在一个单独的.cfg文件中)定义我想要使用的结构,1)在解析它时将输入文件转换为这种格式,以及2)使用这种结构创建MongoAlchemy文档类。我只是遇到了#2的麻烦,但我对可以解决这两个目标的替代实现持开放态度。

这是我输入的.cfg文件。我想把它变成多个mongodb文件。

[foo]
a = val1
b = val2
c = val3
d = val4

这是定义结构的documents.cfg。值是用于区分类型的数字。

[foo]
    [[bar]]
    a = 1
    b = 1
    [[baz]]
    c = 2
    d = 1

以下是类定义

class Bar(db.Document):
    # add class attributes from kwargs
    @classmethod
    def init(cls, **kwargs):
        for k, v in kwargs.items():
            if v == 1:
                setattr(cls, k, db.IntField(min_value=0))

class Baz(db.Document):
    # add class attributes from kwargs
    @classmethod
    def init(cls, **kwargs):
        for k, v in kwargs.items():
            if v == 1:
                setattr(cls, k, db.IntField(min_value=0))
            elif v == 2:
                setattr(cls, k, db.StringField())

我解析documents.cfg以创建两个dicts:

bar_dict = {'a': '1', 'b': '1'}
baz_dict = {'c': '2', 'd': '1'}

然后我将它们传递给相应的init()方法

Bar.init(**bar_dict)
Baz.init(**baz_dict)

这成功添加了属性。但是,在创建Bar(或Baz)实例时,我收到此错误。

mongoalchemy.exceptions.ExtraValueException: a

我的猜测是,这与MongoAlchemy字段应该是类属性而不是实例属性这一事实有关。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

class Bar(db.Document):
    config_extra_fields = 'ignore'
    ...

class Baz(db.Document):
    config_extra_fields = 'ignore'
    ...