2017-02-17 65 views
1

我有兩個型號:Django的:添加額外的數據查詢集

電影

屬性:名字,情節,等級,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" 
     } 
    ] 
    } 
] 

我該如何實現這個目標?

或者,有沒有不同的方法做到這一點?

N.B.我正在使用Django 1.9,Python 2.7

回答

0

是的,有一種不涉及循環和執行N多個查詢以獲取相關控制器對象的方法。

prefetch_related

也有類似目的select_related,在這兩個設計 停止由訪問 相關對象造成數據庫查詢的泛濫,但策略是完全不同的。

select_related通過創建SQL連接並在SELECT語句中包含相關對象的字段 來工作。因此, select_related在相同的數據庫查詢中獲取相關對象。 但是,爲避免由於 加入「多」關係而導致的更大的結果集,select_related限於 單值關係 - 外鍵和一對一。

另一方面,prefetch_related爲每個 關係執行單獨查找,並執行Python中的「連接」。這使得它 預取許多一對多和多對一的一個對象,它不能做 使用select_related,

所以

Movie.objects.all().prefetch_related('director') 
+0

如果我這樣做'Movie.objects.all ().prefetch_related('Directors')',我怎樣才能得到模板文件中的電影導演? – Emu

+0

這是一個不同的問題。如果您遇到問題,請使用您的模板發佈另一個模板。 – e4c5

+0

明白了我自己。不管怎麼說,還是要謝謝你。 – Emu