2011-12-21 12 views
7

Oluşturduğum belgenin gerektirdiği bir liste veya bir çeşit alan grubu alabilmek istiyorum. Gerekli alanları Labong in mongoengine içinde al?

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() 

Bu belgede itibaren ben almalıdır ^: Gerekli alanları olduğu için sonuçlar olarak

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

Örneğin, burada benim belgedir. Mümkün mü? Eğer öyleyse, istenen sonucu nasıl elde edebilirim.

Şimdiden teşekkürler!

cevap

12

Class._fields özelliği üzerinden geçiş yapabilirsiniz. Sınıf Kullanıcı denirdi ise

Bunu yapabilirdi:

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

sen oluşturma sayacı şöyle kullanabilirsiniz yaratma dayalı sıralama yapıldığını listesini almak için:

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

Para için, teşekkürler bir demet! – AlfredN

1

Bu ne olduğunu ben Tüm alanların ve yuvalanmış türlerin bir dict oluşturmak için yazdı.

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

Kullandığım alanları ele aldım, bu kodun yinelenmemesi durumunda daha fazla koşul eklemeniz gerekebilir. – harry