Djangoでの多次元辞書の走査
-
06-07-2019 - |
質問
私はPythonランドでの最初の日、PHPサイトをpythonに変換しようとしています(学習経験)。私はアドバイスを求めています。 pythonersがそれらを呼ぶので、多次元配列または辞書を使用するのがそれほど難しいとは思いませんでした。
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でそれをやった方法で、1つの巨大な深い配列を作成します。 Pythonで複製しようとするのは難しいことがわかっています。
多分私はset_MODELを使用してdjangoの後方参照を行うことができると思ったが、それも理解できなかった。
私の目標を達成するための助けをいただければ幸いです。私の質問が明確であることを願っています
編集:
テンプレートでループ処理が完了すると、次のようになります...
<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 %}
テストしていませんが、動作するはずです。このコードを、PHPまたはPythonでORMを使用していない場合に記述する必要があるコードと比較します。
詳細についてはdjangoのドキュメントをご覧ください。数時間かけてチュートリアル。
更新:&quot; _set.all&quot;を使用するようにコードを変更しました
他のヒント
ある言語またはフレームワークから別の言語またはフレームワークに移行する場合、たとえできるとしても、まったく同じ方法でコードを記述することは通常良い考えではないことを認識する必要があります。
例:
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 ]
など、それは役立ちますか?この場合のキーはタプル(最初の3つの場合は2項目、4番目の場合は4項目)であり、それをどのように扱うかはわかりませんが、キーと値を取得するための項目のループ、それ自体、正常に動作するはずです。
{% 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 %}