9

作成したドキュメントに必要なリストまたはフィールドのセットを取得できるようにしたい。たとえば、これが私のドキュメントです。

nickName        = StringField(required=True)
password        = StringField(required=True)
firstName       = StringField()
lastName        = StringField()
joinDate        = DateTimeField(required=True)
lastVisited     = DateTimeField(required=True)
subscriptions   = DictField(field=ObjectIdField())
isActivated     = BooleanField(default=True)
profileImage    = FileField()
isModerator     = BooleanField(default=False)
description     = StringField()
location        = GeoPointField()
email           = EmailField()
settings        = DictField()

^この文書から私は受け取るべきです:

["nickName","password","joinDate","lastVisited"]

必須フィールドの結果として。これは可能ですか?もしそうなら、どうすれば望ましい結果を達成できますか。

前もって感謝します!

4

2 に答える 2

16

Class._fieldsプロパティをループできます。

クラスがUserと呼ばれる場合、これを行うことができます。

>>> [k for k,v in User._fields.iteritems() if v.required]
['joinDate', 'password', 'nickName', 'lastVisited']

作成に基づいてソートされたリストを取得するには、次のように作成カウンターを使用できます。

>>> from operator import itemgetter
>>> required_fields = ((v.creation_counter, k) for k,v in User._fields.iteritems() if v.required)
>>> sorted_required_fields = map(itemgetter(1), sorted(required_fields, key=itemgetter(0)))
>>> sorted_required_fields
['nickName', 'password', 'joinDate', 'lastVisited']
于 2011-12-21T08:52:05.980 に答える
2

これは、すべてのフィールドとそのネストされたタイプのdictを生成するために私が書いたものです。

from mongoengine.fields import (
    IntField,
    BooleanField,
    StringField,
    DateTimeField,
    DecimalField,
    FloatField,
    LongField,
    ListField,
    EmbeddedDocumentField,
    ReferenceField,
)

__input_types = {
    IntField,
    BooleanField,
    StringField,
    DateTimeField,
    DecimalField,
    FloatField,
    LongField,
}

__input_num_types = {
    IntField,
    BooleanField,
    DecimalField,
    FloatField,
    LongField,
}

def list_schema(m):
    """list all the field in the model
    and in the nested models"""
    sdict = {}
    for k, v in m._fields.iteritems():
        if k == '_cls':
            continue

        ftype = type(v)
        if ftype in __input_types:
            sdict[k] = {
                'default': v.default if v.default else '',
                'is_num': ftype in __input_num_types,
                'required': v.required,
            }
        elif ftype == ListField:
            seqtype = v.field
            if seqtype in __input_types:
                sdict[k] = [{
                    'default': v.default() if v.default else '',
                    'is_num': seqtype in __input_num_types,
                    'required': v.required,
                }]
            else:
                sdict[k] = [list_schema(seqtype.document_type)]
        else:
            sdict[k] = list_schema(v.document_type)
    return sdict
于 2015-07-19T10:48:20.230 に答える