簡體   English   中英

Django:在queryset中添加其他數據

[英]Django: add additional data in queryset

我有兩個型號:

電影

屬性 :名稱,情節,評級,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我正在使用Django 1.9,Python 2.7

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

prefetch_related

具有與select_related類似的目的,因為兩者都旨在阻止由訪問相關對象引起的數據庫查詢泛濫,但策略完全不同。

select_related通過創建SQL連接並在SELECT語句中包含相關對象的字段來工作。 因此,select_related在同一數據庫查詢中獲取相關對象。 但是,為了避免加入“多”關系會產生更大的結果集,select_related僅限於單值關系 - 外鍵和一對一。

另一方面,prefetch_related對每個關系進行單獨查找,並在Python中進行“連接”。 這允許它預取多對多和多對一對象,這是使用select_related無法完成的,

所以

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM