Вопрос

Я в первый день в Python-стране являюсь парнем по PHP, пытаюсь преобразовать php-сайт в python (опыт обучения), и мне не терпится получить совет. Я никогда не думал, что будет так трудно использовать многомерные массивы или словари, как их называют питонеры.

Поэтому я могу создавать многомерные массивы, используя this , но я не могу зациклить его в шаблоне django. это не работает, но я полагаю, что не смогу перебрать его, если смогу заставить его работать.

{% for key,val in dictionary.items %}
Кажется,

работает только для реальных словарей, а не для многомерных словарей Custon.

Я создаю свой словарь из запроса 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 ]

Мне нужно собрать все компании определенной категории, а затем получить все видео этой компании, чтобы я мог легко вставить их в свой шаблон. Вот как я это сделал в php, создав один огромный массив. Попытка дублировать в Python оказалась трудной.

Я подумал, что, возможно, я смогу сделать обратный поиск в django, используя set_MODEL, но я тоже не смог этого понять.

Буду признателен за любую помощь в достижении моей цели. Я надеюсь, что мой вопрос ясен

EDIT:

Когда я закончу цикл в моем шаблоне, он будет выглядеть следующим образом ...

<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>
Это было полезно?

Решение

Вы должны использовать встроенный ORM вместо использования своего собственные запросы (по крайней мере, для чего-то простого, подобного этому) значительно упрощают работу (при условии, что вы также создали свои модели в своем файле models.py)

По вашему мнению:

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

В вашем шаблоне:

{% 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 %}

Я не проверял это, но оно должно работать. Сравните этот код с тем, что вам нужно было бы написать, если бы вы не использовали ORM в PHP или Python.

посмотрите документы django для получения дополнительной информации, я бы порекомендовал занять несколько часов и выполнить учебник .

Обновление: изменил код для использования " _set.all "

Другие советы

При переходе с одного языка или фреймворка на другой вы должны понимать, что обычно не стоит писать точно такой же код, даже если вы можете.

Например:

  

Я создаю свой словарь из SQL-запроса

Почему ты это делаешь? Способ представления объектов из базы данных в Django - использовать модель. Это позаботится о многих вещах для вас, включая SQL, но также поможет в переборе связанных таблиц.

Я тоже новичок в Django ...

Вы должны иметь возможность вкладывать циклы for, чтобы получить что-то вроде этого:

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

и т. д.

Если вы создали сложный словарь следующим образом:

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 ]

и т. д., это поможет? Ключом в этом случае будет кортеж (с двумя элементами в первых трех случаях, четырьмя элементами в четвертом), и я не уверен, как вы относитесь к нему, но цикл с элементами для получения ключа и значения, По сути, должно работать нормально.

<код>

<код>
{% 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 %}

<код>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top