Pregunta

Soy un chico PHP en mi primer día en Python-land, tratando de convertir un sitio php a python (experiencia de aprendizaje), y me duele el consejo. Nunca pensé que sería tan difícil usar matrices o diccionarios multidimensionales como los llaman los pitoneros.

Para poder crear matrices multidimensionales usando this , pero no puedo repetirlo en una plantilla de django. esto no funciona, pero imagino que no puedo recorrerlo si pudiera hacerlo funcionar.

{% for key,val in dictionary.items %}
Parece que

solo funciona para los diccionarios reales, no para las clases de diccionarios multidimensionales de custon.

Estoy creando mi diccionario a partir de una consulta SQL:

vid[ video[ 7 ] ][ 'cat_short_name' ] = video[ 2 ]
vid[ video[ 7 ] ][ 'cat_name' ] = video[ 1 ]
vid[ video[ 7 ] ][ 'cat_id' ] = video[ 7 ]

vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_short_name' ] = video[ 5 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_name' ] = video[ 4 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_website' ] = video[ 6 ]

vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'top_video' ] = 0
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_id' ] = video[ 8 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_name' ] = video[ 9 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_url' ] = video[ 10 ]

Básicamente necesito obtener todas las compañías en una determinada categoría y luego obtener todos los videos de esa compañía para poder anidarlos fácilmente en mi plantilla. Así es como lo hice en php, creando una gran matriz profunda. Intentar duplicar en Python ha resultado difícil.

Pensé que tal vez podría hacer las búsquedas hacia atrás en django usando set_MODEL, pero tampoco pude resolver eso.

Cualquier ayuda sobre cómo lograr mi objetivo sería apreciada. Espero que mi pregunta sea clara

EDITAR:

Cuando termine de recorrer mi plantilla, se ve así ...

<h1>Category</h1>
   <h2>Company</h2>
   <ul>
        <li>video</li>
    </ul>
    <h2>Company</h2>
    <ul>
        <li>video</li>
        <li>video</li>
    </ul>
<h1>Category</h1>
   <h2>Company</h2>
   <ul>
        <li>video</li>
    </ul>
    <h2>Company</h2>
    <ul>
        <li>video</li>
        <li>video</li>
    </ul>
¿Fue útil?

Solución

Debería utilizar el ORM integrado en lugar de utilizar su consultas propias (al menos para algo simple como esto), hace las cosas mucho más fáciles (suponiendo que también haya construido sus modelos en su archivo models.py)

En su opinión:

def categories_view(request):
    categories = Categories.objects.all()   #maybe put an order_by or filter here
    return render_to_response("your_template.html", {'categories':categories})

En su plantilla:

{% for category in categories %}
    <h1>{{ category.name }}</h1>
    {% for company in category.company_set.all %}
        <h2>{{ company.name }}</h2>
        <ul>
        {% for video in company.video_set.all %}
            <li>{{ video.name }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
{% endfor %}

No lo he probado pero debería funcionar. Compare este código con lo que tendría que escribir si no estuviera usando ORM, ya sea en PHP o Python.

eche un vistazo a los documentos de django para obtener más información. Recomiendo tomarse unas horas y hacer el tutorial .

Actualización: modificó el código para usar " _set.all "

Otros consejos

Al pasar de un lenguaje o marco a otro, debe darse cuenta de que no suele ser una buena idea escribir su código exactamente de la misma manera, incluso si puede.

Por ejemplo:

  

Estoy creando mi diccionario a partir de una consulta SQL

¿Por qué haces esto? La forma de representar objetos de una base de datos en Django es usar un modelo. Eso se encargará de muchas cosas para usted, incluido el SQL, pero también lo ayudará a recorrer las tablas relacionadas.

También soy un principiante de Django ...

Debería poder anidar los bucles for para obtener algo como esto:

{% for key,val in dictionary.items %}
    {% for key,val in val.items %}

y así sucesivamente.

Si creó su complicado diccionario de la siguiente manera:

vid[ video[ 7 ], 'cat_short_name' ] = video[ 2 ]
vid[ video[ 7 ], 'cat_name' ] = video[ 1 ]
vid[ video[ 7 ], 'cat_id' ] = video[ 7 ]

vid[ video[ 7 ], 'companies', video[ 14 ], 'comp_short_name' ] = video[ 5 ]

etc., ¿eso ayudaría? La clave en este caso sería una tupla (con 2 elementos en los primeros tres casos, 4 elementos en el cuarto), y no estoy seguro de cómo quiere tratarlo, pero el ciclo de elementos para obtener clave y valor, per se, debería funcionar bien.

{% for key, val in vid.items %}
    <h1>{{ val.cat_name }}</h1>
    {% for k2, v2 in val.companies.items %}
        <h2>{{ v2.comp_name }}</h2>
        <ul>
        {% for k3, v3 in v2.videos.items %}
            <li>{{ v3.vid_name }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
{% endfor %}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top