2

個人的なプロジェクトで Flask-MongoAlchemy を使用しています。解析して mongodb ドキュメント エントリにしたい .cfg 入力ファイルがいくつかあります。残念ながら、.cfg ファイルはフラットなので、各ファイルから複数の異なるドキュメントを作成したいと考えています。使用する構造を 1 か所 (別の .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 を解析して、次の 2 つの辞書を作成します。

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 フィールドがインスタンス属性ではなくクラス属性でなければならないという事実に関係していると思います。何か助けはありますか?

4

1 に答える 1

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

class Baz(db.Document):
    config_extra_fields = 'ignore'
    ...
于 2013-03-03T15:38:29.503 に答える