Django - перестроить строку запроса без одной из переменных - PullRequest
9 голосов
/ 18 февраля 2011

У меня есть представление Django, которое обрабатывает запрос GET.Я хочу перестроить строку запроса, чтобы включить все переменные , за исключением для одной.

Я изначально использовал списочное понимание:

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

Кто-нибудь может подумать о еще лучшем подходе?

Ответы [ 2 ]

11 голосов
/ 18 февраля 2011

Django помещает переменные запроса GET в словарь для вас, поэтому request.GET уже является QueryDict. Вы можете просто сделать это:

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

Обратите внимание, что словари в python (и django QueryDicts) не имеют метода del (), вы должны использовать встроенную в python функцию del (). QueryDicts являются неизменяемыми (но их копии не являются), поэтому вы были правы скопировать его, прежде чем пытаться удалить из него. Кроме того, в вашей последней строке z.urlencode () возвращает строку, она не преобразует z в строку, закодированную в URL, поэтому вам нужно присвоить ее другой переменной, чтобы потом что-то с ней сделать.

Надеюсь, что помогает

3 голосов
/ 18 февраля 2011

Лучший подход определенно хорош.Я продолжал думать, что ваш второй (более низкий) пример был вашим самым новым и был полностью сбит с толку.

Я даже не могу представить себе другой метод, если мы не начнем делать то, что нам не следует делать, например, установить _mutableатрибут False вместо copy().

Примечание: это для дерьма и хихиканья, на самом деле не делайте этого

2110003 вызовов функций в 2.117 CPUсекунд

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 CPU секунд

 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 секунд CPU

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