私は2つのモデルを持っています:
映画
属性:名前、プロット、評価、release_date、写真
ディレクター
属性:名前、略歴、写真
映画と監督のモデルには、多対多の関係があります。
今私のmovies/views.py
ファイルに:
def movies_index(request):
movies = Movie.objects.all()
for movie in movies:
movie.directors = movie.directors.all() # tried but in the template it gives me error when accessing by movie.directors
# insert directors in every movie object
context_data = {
'movies': movies
}
return render(request, 'movies/index.html', context_data)
すべての映画オブジェクトに監督データを挿入したいと思います。結果は次のようになります。
[
{
name: "12 Angry Man",
plot: "bla",
release_date: "1-2132",
directors: [
{
name: "Quentine",
bio: "Lodfs"
},
{
name: "Tarantino",
bio: "Lodsdfs"
}
]
}
]
どうすればこれを達成できますか?
または、これを行う別のアプローチはありますか?
NB私はDjango1.9、Python2.7を使用しています
はい、関連するダイレクタオブジェクトをフェッチするためにさらにN個のクエリをループして実行することを含まない別のアプローチがあります。
select_relatedと同様の目的があり、どちらも関連オブジェクトへのアクセスによって引き起こされるデータベースクエリの大洪水を阻止するように設計されていますが、戦略はまったく異なります。
select_relatedは、SQL結合を作成し、関連オブジェクトのフィールドをSELECTステートメントに含めることで機能します。このため、select_relatedは、同じデータベースクエリ内の関連オブジェクトを取得します。ただし、「多くの」関係を越えて結合することで生じるはるかに大きな結果セットを回避するために、select_relatedは単一値の関係(外部キーと1対1)に制限されています。
一方、prefetch_relatedは、関係ごとに個別のルックアップを実行し、Pythonで「結合」を実行します。これにより、select_relatedを使用して実行できない、多対多および多対1のオブジェクトをプリフェッチできます。
そう
Movie.objects.all().prefetch_related('director')
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加