2010-02-07 8 views
5

मैं एक एपीआई पर परिष्कृत स्पर्श डाल रहा हूं जिसे मैंने डीजेंगो-पिस्टन का उपयोग करते हुए एक Django ऐप के लिए लिखा है। एपीआई अनुरोध या आईपी पते से क्रमशः Request या IPAddress उदाहरणों से खोज करने में सक्षम है। प्रत्येक अनुरोध में इसके साथ जुड़े 1 या अधिक IPAddress हो सकते हैं।Django पिस्टन: मैं हैंडलर परिणामों से नेस्टेड फ़ील्ड को कैसे बाहर निकाल सकता हूं? क्या यह भी संभव है?

तो, उदाहरण के लिए मेरे पास एक एपीआई कॉल है जो सभी IPAddress "सक्रिय", "निष्क्रिय", या "सभी" (किसी भी के लिए) की गतिविधि स्थिति से मेल खाने वाली वस्तुओं को दिखाएगी। Request जिसमें प्रत्येक IPAddress उदाहरण संबंधित है IPAddress.request के रूप में उपलब्ध है।

मेरी समस्या यह है कि Request.inputter अनुरोध के प्रावधान वाले व्यक्ति के User उदाहरण के लिए एक विदेशी कुंजी है। जब मेरे परिणाम हैंडलर से वापस लौटाए जाते हैं तो मैंने इस एपीआई कॉल के लिए बनाया है, User इंस्टेंस के सभी फ़ील्ड प्रदर्शित होते हैं, जिनमें password शामिल हैं।

यह बुरा है; मुझे यह नहीं चाहिए। यहाँ

class SearchByIPStatusHandler(BaseHandler): 
    model = IPAddress 
    allowed_methods = ('GET',) 
    anonymous = AnonymousIPHandler 

    def read(self, request, status): 
     """ 
     Returns IP addresses based on activity status. 
     Status: 'active', 'inactive', 'all' 

     """ 
     if status == 'all': 
      return self.model.objects.all() 
     else: 
      active = True if (status=='active') else False 
      return self.model.objects.filter(active=active) 

और /api/show/all/ से परिणाम का एक उदाहरण है:

तो यहाँ

मेरी हैंडलर है

<response> 
    <resource> 
    <updated>2010-02-05 17:08:53.651729</updated> 
    <expires>2010-02-12 17:08:23</expires> 
    <created>2010-02-05 17:08:53.625318</created> 
    <nexthop>255.255.255.255</nexthop> 
    <netmask>255.255.255.254</netmask> 
    <address>2.4.6.80/31</address> 
    <active>True</active> 
    <id>4</id> 
    <request> 
     <updated>2010-02-05 17:08:53.382381</updated> 
     <created>2010-02-05 17:08:53.382313</created> 
     <expires>2010-02-12 17:08:23</expires> 
     <incident>20100212-badthings-01</incident> 
     <reason>bad things happened</reason> 
     <inputter> 
     <username>jathan</username> 
     <first_name>Jathan</first_name> 
     <last_name>McCollum</last_name> 
     <is_active>True</is_active> 
     <email>[email protected]</email> 
     <is_superuser>True</is_superuser> 
     <is_staff>True</is_staff> 
     <last_login>2010-02-05 18:55:51.877746</last_login> 
     <password>[ENCRYPTED STRING I REDACTED]</password> 
     <id>1</id> 
     <date_joined>2010-01-28 09:56:32</date_joined> 
     </inputter> 
     <requester>joeuser</requester> 
     <active>True</active> 
    </request> 
    </resource> 
</response> 

सभी मैं वास्तव में चाहते हैं परिणामों में inputter.username, नहीं के सभी है अन्य सामान। मैंने हैंडलर पर exclude विशेषता को लागू करने के लिए विभिन्न पुनरावृत्तियों की कोशिश की है। मैं सिर्फ पूरे अनुरोध क्षेत्र को छोड़ते हैं, कि, ठीक काम करता है तो जैसे:

हैंडलर में:

exclude = ('request',) 

कौन सा में परिणाम:

<response> 
    <resource> 
    <updated>2010-02-05 17:08:53.651729</updated> 
    <expires>2010-02-12 17:08:23</expires> 
    <created>2010-02-05 17:08:53.625318</created> 
    <nexthop>255.255.255.255</nexthop> 
    <netmask>255.255.255.254</netmask> 
    <address>2.4.6.80/31</address> 
    <active>True</active> 
    <id>4</id> 
    </resource> 
</response> 

लेकिन इन परिणामों से यह भी है कि मैं क्या नहीं चाहते हैं ।

तो, अंत में, मेरे सवाल:

हैंडलर परिणामों से मैं कैसे नेस्ट बाहर कर सकते हैं क्षेत्रों? क्या यह भी संभव है?

मैं निम्नलिखित के विभिन्न पुनरावृत्तियों, जो सभी या तो कोई परिणाम है, या अनपेक्षित परिणामों का प्रयास किया है:

# try to exclude request.inputter 
exclude = (('request', ('inputter',),)) 

# try to exclude request.inputter.password 
exclude = (('request', ('inputter', ('password',)))) 

मुझे लगता है कि मैं गलत समझ रहा हूँ या जिस तरह से क्षेत्र बहिष्करण इस संदर्भ में किया जाता है का दुरुपयोग , इसलिए इस विषय पर किसी भी ज्ञान की सराहना की जाती है।

उत्तर

3

हैंडलर fields = खंड के माध्यम से वांछित फ़ील्ड निर्दिष्ट करके वांछित परिणाम प्राप्त कर सकते हैं।

मॉडल क्षेत्रों विदेशी कुंजी से आ रही इस तरह निर्दिष्ट किया जा सकता:

('foreign_model_field', ('nested_field1', 'nested_field2')) 

आपके मामले में, निम्नलिखित काम करना चाहिए (अपने क्षेत्रों में से कुछ बाहर संक्षिप्तता के लिए छोड़ दिया):

fields = ('updated', 'expires', 'created', 
    ('request', ('incident', 'reason', ('inputter', ('username',))))) 
+0

यह वास्तव में काम करता है। जवाब के लिए धन्यवाद! मैं जो उम्मीद कर रहा था उससे ज्यादा कठिन (विशेष रूप से जब मुझे इसे कई हैंडलरों में डुप्लिकेट करना होगा), लेकिन समाधान एक समाधान है! – jathanism

3

क्या आप बाहर निकलने के बजाय शामिल करने का प्रयास कर सकते हैं? जैसे

include = (('request', ('inputter', ('username', 'therestofthefields')))) 

अगर मैं exclude लिखा include के रूप में के रूप में बहुमुखी होने के लिए मुझे याद नहीं।

इसके अलावा, django-piston Google समूह है जहां हम ज्यादातर चीजों पर चर्चा करते हैं, तो आपको इस प्रश्न पूछने में और अधिक सफलता हो सकती है।

+0

के लिए धन्यवाद चिम्पिंग, जेस्पर। मैं इसे मेलिंग सूची पर डुप्लिकेट करूंगा। – jathanism

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

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