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