【问题标题】:Get required fields from Document in mongoengine?从 mongoengine 的 Document 中获取必填字段?
【发布时间】:2011-12-21 08:13:01
【问题描述】:

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

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"]

作为必填字段的结果。这可能吗?如果是这样,我怎样才能达到预期的效果。

提前致谢!

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    您可以循环访问 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']
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我涵盖了我正在使用的字段,如果此代码无法迭代,您可能需要添加更多条件。
      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多