Python 是否从mongoengine中的文档中获取必填字段?

Python 是否从mongoengine中的文档中获取必填字段?,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,我希望能够获得我创建的文档所需的列表或某种字段集。例如,以下是我的文档: nickName = StringField(required=True) password = StringField(required=True) firstName = StringField() lastName = StringField() joinDate = DateTimeField(required=True) lastVisited

我希望能够获得我创建的文档所需的列表或某种字段集。例如,以下是我的文档:

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"]
作为必填字段的结果。这可能吗?如果是这样,我如何才能达到预期的结果


提前谢谢

您可以在类中循环。\u 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']

这就是我编写的用来生成所有字段及其嵌套类型的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

我介绍了我正在使用的字段,如果此代码无法迭代,您可能需要添加更多条件。