2011-02-18 16 views
9

मेरे पास एक Django व्यू है जो एक GET अनुरोध को संसाधित करता है। मैं को सभी के लिए को छोड़कर सभी स्ट्रिंग्स को शामिल करने के लिए क्वेरी स्ट्रिंग को पुनर्निर्माण करना चाहता हूं।Django - एक चर के बिना क्वेरी स्ट्रिंग को पुनर्निर्मित करें

मैं शुरू में सूची समझ उपयोग कर रहा था:

>>> from django.http import QueryDict 
>>> q = QueryDict('a=2&b=4&c=test') // <--- make believe this is request.GET 
>>> z = QueryDict('').copy() 
>>> z.update(dict([x for x in q.items() if x[0] != 'b'])) 
>>> z.urlencode() 

लेकिन मेरा मानना ​​है कि यह एक बेहतर समाधान हो सकता है:

>>> from django.http import QueryDict 
>>> q = QueryDict('a=2&b=4&c=test') // <--- make believe this is request.GET 
>>> z = q.copy() 
>>> del z['b'] 
>>> z.urlencode() 

किसी को भी एक और भी बेहतर दृष्टिकोण के बारे में सोच सकते हैं?

उत्तर

10

Django आपके लिए एक शब्दकोश में जीईटी अनुरोध चर डालता है, इसलिए अनुरोध करें। जीईटी पहले से ही एक प्रश्नोत्तरी है। तुम बस ऐसा कर सकते हैं:

z = request.GET.copy() 
del z['a'] 

नोट अजगर (और Django QueryDicts) में शब्दकोशों एक डेल() विधि की जरूरत नहीं है, आप अजगर के डेल() फ़ंक्शन में बनाया का उपयोग करने के लिए है। QueryDicts अपरिवर्तनीय हैं (लेकिन उनमें से प्रतियां नहीं हैं), इसलिए आप इसे हटाने की कोशिश करने से पहले इसे कॉपी करने का अधिकार रखते थे। साथ ही, आपकी पिछली पंक्ति z.urlencode() में एक स्ट्रिंग देता है, यह ज़ेड को यूआरएल एन्कोडेड स्ट्रिंग में परिवर्तित नहीं करता है, इसलिए आपको बाद में कुछ करने के लिए इसे किसी अन्य चर को असाइन करने की आवश्यकता है।

आशा है कि

+0

Yup @danny। क्षमा करें मैंने 'del' भाग को गलत टाइप किया। लेकिन उदाहरण को स्पष्ट रखने के लिए मैंने अभी 'q' का उपयोग किया था। –

+0

हम्म .. आपके संपादन से आपका क्या मतलब है? मुझे नहीं लगता कि मैं 'ए' चर का उपयोग करता हूं। लेकिन फिर भी, यह सिर्फ एक उदाहरण है। –

+0

मैं केवल 'request.GET [' a ']' तक पहुंचने का प्रयास कर रहा हूं, जब मैं 'www.yourwebsite.com?a=' के बजाय 'www.yourwebsite.com' पर जाता हूं, तो मैं KeyError के लिए बाहर निकलने का कह रहा था। 2 और बी = 3' लेकिन मुझे लगता है कि यह विषय बंद है क्योंकि यह सिर्फ एक उदाहरण है और आपका पूरा दृश्य – danny

3

शीर्ष दृष्टिकोण निश्चित रूप से उतना ही अच्छा है जितना मिलता है। मैंने सोचा कि आपका दूसरा (निचला) उदाहरण आपका सबसे नया था और पूरी तरह उलझन में था।

मैं तब तक एक और विधि की कल्पना नहीं कर सकता जब तक कि हम उन चीजों को शुरू नहीं करते हैं जिन्हें हम नहीं करना चाहते हैं, जैसे _mutable के बजाय False पर विशेषता।

नोट: इस shits और गिगल्स के लिए है, है वास्तव में इस

2110003 समारोह 2.117 सीपीयू सेकंड

def test3(n): 
    for i in range(n): 
     q = QueryDict('a=2&b=4&c=test') # we could pass the mutable argument here 
     # but normally we wouldn't be constructing the querydict ourselves 
     q._mutable = True 
     del q['b'] 
     q.urlencode() 

3010003 समारोह 3.065 सीपीयू सेकंड

def test1(n): 
    for i in range(n): 
     q = QueryDict('a=2&b=4&c=test') 
     z = q.copy() 
     del z['b'] 
     z.urlencode() 
में कॉल में कॉल नहीं कर

2860003 फ़ंक्शन कॉल 3.388 सीपीयू सेकेंड में

def test2(n): 
    for i in range(n): 
     q = QueryDict('a=2&b=4&c=test') 
     z = QueryDict('').copy() 
     z.update(dict([x for x in q.items() if x[0] != 'b'])) 
     z.urlencode() 
+0

बस उत्सुक: आप उन आंकड़ों को कैसे प्राप्त कर रहे हैं? –

+2

'cProfile' http://docs.python.org/library/profile.html –

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