2011-02-18 24 views
9

değişkenlerinden biri olmadan yeniden oluştur Bir GET isteğini işleyen bir Django görünümü var. Biri için hariç tüm değişkenleri içerecek şekilde sorgu dizesini yeniden oluşturmak istiyorum.Django - Bir sorgu dizesini

Başlangıçta liste anlama kullanıyordu:

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

Ama bu daha iyi bir çözüm olabilir inanıyoruz:

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

kimse daha iyi bir yaklaşım düşünebilir mi?

cevap

10

Django, GET istek değişkenlerini sizin için bir sözlüğe koyar, bu nedenle request.GET zaten bir QueryDict'dır. Sadece bunu yapabilirsiniz: piton (ve django QueryDicts) 'de sözlükleri bir del() yöntemine sahip olmadığını

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

Not, sen piton en del() işlevi inşa kullanmak zorunda. QueryDicts değişmez (ancak bunların kopyaları değildir), bu yüzden ondan silmeye çalışmadan önce kopyalamak için haklıydınız. Ayrıca, son satırınızda z.urlencode() bir dizge döndürür, bir URL'yi kodlanmış bir dizeye dönüştürmez, böylece daha sonra bir şeyler yapmak için başka bir değişkene atamanız gerekir.

+0

Yup @danny. Üzgünüm, 'del' bölümünü yanlış yazdım. Ama ben örneği daha açık tutmak için 'q' kullanıyorum. –

+0

Hmm .. düzenlemenizden ne demek istiyorsunuz? Ben 'a' değişkenini kullanmıyorum. Ama yine de, bu sadece bir örnektir. –

+0

Sadece birisi www.yourwebsite.com?a= yerine "www.yourwebsite.com" adresine giderse 'request.GET ['a']' öğesine erişmeye çalışıyorsanız KeyError’a dikkat etmeyi söylüyordum. 2 & b = 3' Ama sanırım bu konu sadece bir örnektir ve tüm görünümünüzü değil – danny

3

üst yaklaşımı yardımcı

Umut kesinlikle alır o kadar iyidir. İkinci (alt) örneğinizin en yeni olduğunu düşündüğümüzü düşündüm ve tamamen kafam karıştı.

copy() yerine özniteliğini olarak ayarlamak gibi, yapmayacağımız şeyler yapmaya başlamadıkça başka bir yöntem hayal bile edemiyorum.

Not: Bu aslında bu

2110003 fonksiyon

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 fonksiyon 3,065 CPU saniye

def test1(n): 
    for i in range(n): 
     q = QueryDict('a=2&b=4&c=test') 
     z = q.copy() 
     del z['b'] 
     z.urlencode() 
çağrıları 2,117 işlemci saniyede çağrıları yapmayın, shits ve espri olsun diye olan

2860003 işlev çağrıları 3.388 CPU saniyede

+0

Sadece merak ediyorum: Bu istatistikleri nasıl alıyorsunuz? –

+2

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

İlgili konular