1

最も使用されているソファビュー (主に CRUD 用) を備えた基本モデルクラスを構築しようとしています。

モデルクラス名ごとに内部のjs文字列を少し変更する必要があるため、ViewFieldsを基本クラスに追加することはできません。
これは基本クラス内では問題ありません__init__が、何らかの理由で ViewField が機能しません。

ViewField を通常のように使用する場合:

class MyModel(Document):
    only_carrots = ViewField("mymodel", js-string)

次に、実行すると:

mod = MyModel()
mod.only_carrots 

次のように表示されます。
<ViewDefinition '_design/mymodel/_view/only_carrots'>

ただし、ViewField が の実行中に追加されると__init__、次のようになります。

<flaskext.couchdb.ViewField object at 0x10fe8f190>

基本モデルで実行されるコードは次のとおりです。

    for attr_name in dir(self):
        if not attr_name.startswith("_") and attr_name not in ["id", "rev"]:
            attr_val = getattr(self, attr_name)
            if isinstance(attr_val, CouchView):
                vd = ViewField(self.doc_type, attr_val.template.render(self.__dict__), name=attr_name, wrapper=self.__class__)
                setattr(self, attr_name, vd)

CouchView クラスは私自身のものです。メタクラス内のコードによって検出されない方法で ViewField の情報を格納するためにのみ使用されます。

Document クラス (私の基本モデルはサブクラスです) には__metaclass__. これにより、少なくとも ViewField を機能させるための作業の一部が処理されますが、その部分は自分のクラスでカバーされていると思います。

python-couchdb のソースは、
https ://code.google.com/p/couchdb-python/source/browse/#hg%2Fcouchdb にあります。

Flask-CouchDB の場合:
https://bitbucket.org/leafstorm/flask-couchdb/src

では、ViewField が追加されたためにメタクラス内で__init__使用できない場合、ViewField を機能させるにはどうすればよいでしょうか。__new__

助けてくれてありがとう。

4

1 に答える 1

0

まあ、私はそれを理解したと思います。または、少なくとも回避策です。

ViewField が行うwrapperことは、バインドされているクラスによって満たされた -param で ViewDefinition を起動することだけです。

したがって、これらすべてを初期化時に行う場合は、代わりに次のように ViewDefinition を呼び出すだけです。

    def __init__(self, *args, **kwargs):
    if not self.doc_type:
        self.doc_type = self.__class__.__name__
    for attr_name in dir(self):
        if not attr_name.startswith("_") and attr_name not in ["id", "rev"]:
            attr_val = getattr(self, attr_name)
            if isinstance(attr_val, CouchView):
                setattr(self, attr_name, ViewDefinition(self.doc_type, attr_name, attr_val.template.render(self.__dict__), wrapper=self))

もちろん、モデル クラスをマネージャーに追加する前にインスタンス化することを忘れないでください (フラスコ拡張機能が付属しています)。

user = User()
manager.add_document(user)

これは、テスト中に私を噛みました。疲れたらやめなきゃ。
何らかの理由_data = {}で、カスタム基本クラスに追加する必要があります。正しく設定されていない理由はわかりませんが、簡単に修正できます。

于 2013-07-01T13:57:21.093 に答える