Django和SQL问题:减少数据库命中数

时间:2009-07-13 19:29:58

标签: sql django refactoring

对于我的一个客户,我正在从Django Admin生成客户列表。它按状态拆分客户端:当前,已获取和过去。

目前,该列表的视图代码如下:

def clients_list(request):
current_clients = Client.objects.all().filter(status='current')[:10]
acquired_clients = Client.objects.all().filter(status='acquired')[:10]
past_clients = Client.objects.all().filter(status='past')[:10]

return render_to_response('clients/list.html', {
    'current_clients': current_clients,
    'acquired_clients': acquired_clients,
    'past_clients': past_clients
})

现在,我知道这不是理想的,因为当我非常确定只有一个查询可以做到这一点时,它会三次访问数据库。是否有可能重构此代码,以便它只访问数据库一次并使用Python将结果拆分为这三个变量?或者我只是在申请的一个微不足道的部分上过分强调?

谢谢,

马特

1 个答案:

答案 0 :(得分:2)

除非你已经分析了你的应用程序,并且知道这是一个严重的瓶颈,否则我认为你已经得到了答案:“只是压力过大”。

可以使用Q objects

在单个ORM语句中获取您的数据
clients = Client.objects.filter(Q(status='current')|Q(status='acquired')|Q(status='past'))[:30]

...但是,您在一个查询集中拥有所有三种状态,并且可能不会有十种状态,并且您仍然需要将它们分离为模板。