2011-12-21 14 views
7

मैं एक सूची या कुछ प्रकार के फ़ील्ड सेट प्राप्त करने में सक्षम होना चाहता हूं जो मेरे द्वारा बनाए गए दस्तावेज़ द्वारा आवश्यक हैं।मोंगोएन्गिन में दस्तावेज़ से आवश्यक फ़ील्ड प्राप्त करें?

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

आवश्यक फ़ील्ड होने के लिए परिणाम के रूप में उदाहरण के लिए, यहाँ मेरी दस्तावेज है। क्या यह संभव है? यदि हां, तो मैं वांछित परिणाम कैसे प्राप्त कर सकता हूं।

अग्रिम धन्यवाद!

उत्तर

12

आप कक्षा._फील्ड संपत्ति के माध्यम से पाश कर सकते हैं।

अपनी कक्षा उपयोगकर्ता बुलाया गया था, तो आप ऐसा कर सकते हैं:

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

पैसे पर, एक गुच्छा धन्यवाद! – AlfredN

1

यह क्या है मैं सभी क्षेत्रों और उनके घोंसले के प्रकार के एक निर्देश उत्पन्न करने के लिए लिखा था।

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

मैंने उन फ़ील्ड को कवर किया है जिनका मैं उपयोग कर रहा हूं, यदि आपको यह कोड फिर से चालू करने में विफल रहता है तो आपको और शर्तें जोड़नी पड़ सकती हैं। – harry

संबंधित मुद्दे