如何从mongoengine的文档中获取必要字段?
我想要获取一个列表,或者说一组我创建的文档中需要的字段。比如说,这里有我的文档:
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"]
作为需要的字段的结果。这可能吗?如果可以的话,我该怎么做才能得到想要的结果呢。
提前谢谢你!
2 个回答
2
这是我写的代码,用来生成一个字典,里面包含了所有字段及其嵌套类型。
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
17
你可以通过 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']