2011-12-21 11 views
7

Deseo poder obtener una lista o algún tipo de conjunto de campos requeridos por el documento que he creado. Por ejemplo, aquí está mi documento:Obtenga los campos obligatorios del documento en 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() 

^A partir de este documento que debe recibir:

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

como resultado para ser campos obligatorios. es posible? Si es así, ¿cómo puedo lograr el resultado deseado?

¡Gracias de antemano!

Respuesta

12

Puede recorrer la propiedad Class._fields.

Si su clase se llama usuario que podría hacer esto:

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

Para obtener una lista ordenada basada en la creación puede utilizar el contador de la creación de este modo:

>>> 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'] 
+0

¡Sobre el dinero, muchas gracias! – AlfredN

1

Esto es lo que escribió para generar un dict de todos los campos y sus tipos anidados.

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 
+0

Cubrí los campos que estoy usando, es posible que tenga que agregar más condiciones si este código no se puede repetir. – harry

Cuestiones relacionadas