Django:在queryset中添加其他数据

时间:2017-02-17 05:23:43

标签: python django django-views

我有两种模式:

电影

属性:名称,情节,评级,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

1 个答案:

答案 0 :(得分:0)

是的,有一种不同的方法,不涉及循环和执行N次查询以获取相关的导向器对象。

prefetch_related

  

具有与select_related类似的目的,因为两者都是设计的   停止因访问而导致的数据库查询泛滥   相关的对象,但策略是完全不同的。

     

select_related通过创建SQL连接并包含字段来工作   SELECT语句中的相关对象。为此原因,   select_related获取同一数据库查询中的相关对象。   但是,要避免由此产生的更大的结果集   加入'many'关系时,select_related仅限于   单值关系 - 外键和一对一。

     另一方面,

prefetch_related对每个进行单独查找   关系,并在Python中“加入”。这允许它   预取多对多和多对一对象,这是无法完成的   使用select_related,

所以

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