2013-02-20 48 views
1

考虑下面的代码:django查询select_related是否需要后续查询?

progresses = Progress.objects.filter(customer=request.user).select_related() 
    if id is not None 
     progress = progresses.get(pk=id) 
    else: 
     progress = progresses[0] 

我是否需要添加select_related()为progress = progresses.filter(pk=id).select_related()这样第二个查询?

回答

1

不,您的progress queryset对象已经具有包含在底层sql中的外键关系。它创建一个带连接的选择查询。进一步过滤不会删除连接。

docs中有一个进一步处理包括select_related(尽管不使用filter)的查询的例子。

0

filter()和select_related()链接的顺序并不重要。 这些查询集是等价的:

Entry.objects.filter(pub_date__gt=timezone.now()).select_related('blog') 
Entry.objects.select_related('blog').filter(pub_date__gt=timezone.now()) 

来自官方的Django文档:https://docs.djangoproject.com/en/1.9/ref/models/querysets/