es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django Python urlencode mismo clave con múltiples valores.

Como sugiere el título, estoy tratando de codificar en URL utilizando OrderedDict en python.

def url_replace(request, field, value, direction=""):
    dict_ = request.GET.copy()
    if field == "orderby" and field in dict_.keys():
        if dict_[field].startswith("-") and dict_[field].lstrip("-") == value:
            dict_[field] = value
        elif dict_[field].lstrip("-") == value:
            dict_[field] = "-" + value
        else:
            dict_[field] = direction + value
    else:
        dict_[field] = direction + str(value)

print("INORDEN___________________")
print(dict_)
print(super(MultiValueDict, dict_).items())
print("ORDENADO_____________")
print(OrderedDict(super(MultiValueDict, dict_).items()))
print(OrderedDict(dict_.items()))
return urlencode(OrderedDict(dict_.items()))

La salida para el código anterior es:

INORDEN___________________
<querydict: {'assigned_to_id':="" ['1',="" '2'],="" 'client_id':="" ['2',="" '1'],="" 'page':="" ['2']}="">
dict_items([('assigned_to_id', ['1', '2']), ('client_id', ['2', '1']), ('page', ['2'])])
OrderedDict([('assigned_to_id', '2'), ('client_id', '1'), ('page', '2')])
ORDENADO_____________
OrderedDict([('assigned_to_id', ['1', '2']), ('client_id', ['2', '1']), ('page', ['2'])])
OrderedDict([('assigned_to_id', '2'), ('client_id', '1'), ('page', '2')])

Como puedes ver, el campo assigned_to_id tiene solo el número 2 al final.

Lo que espero es un OrderedDict con:

OrderedDict([('assigned_to_id', '2'), ('assigned_to_id', '1'), ('client_id', '1'), ('client_id', '2'), ('page', '2')])

Tal vez haya un enfoque mejor para esto, soy un poco nuevo en python.

Mi objetivo final es devolver un dict con múltiples claves o cualquier cosa que se pueda utilizar en urlencode.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código anterior actualmente genera un diccionario ordenado con solo el último valor para cada clave del diccionario desordenado original. Para lograr un diccionario ordenado con todos los valores para cada clave, puedes crear primero un diccionario ordenado vacío y luego iterar a través de las claves en el diccionario desordenado original. Para cada clave, puedes luego iterar a través de los valores y agregarlos al diccionario ordenado con la clave como clave y el valor como valor. Aquí tienes un ejemplo de cómo puedes modificar el código para lograr esto:

    from collections import OrderedDict
    
    def url_replace(request, field, value, direction=""):
        dict_ = request.GET.copy()
    
        if field == "order_by" and field in dict_.keys():
            if dict_[field].startswith("-") and dict_[field].lstrip("-") == value:
                dict_[field] = value
            elif dict_[field].lstrip("-") == value:
                dict_[field] = "-" + value
            else:
                dict_[field] = direction + value
        else:
            dict_[field] = direction + str(value)
    
        ordered_dict = OrderedDict()
    
        for key in dict_:
            values = dict_.getlist(key)
            for value in values:
                ordered_dict.setdefault(key, []).append(value)
    
        return urlencode(ordered_dict)
    

    Este código modificado crea un nuevo diccionario ordenado vacío llamado ordered_dict. Luego, itera a través de las claves del diccionario desordenado original y obtiene todos los valores para cada clave usando el método getlist. Para cada valor, lo agrega al ordered_dict con la clave como clave y el valor como valor usando el método setdefault. Finalmente, devuelve el ordered_dict con todos los valores para cada clave.

Comments are closed.