Django的。我如何优化数据库查询?

时间:2016-01-26 09:50:50

标签: django database django-queryset

我有两种模式:

class Status(models.Model): 

     CHOISES = ( 
         ('new', 'New'), 
         ('in_progress', 'InProgress'), 
         ('on_review', 'OnReview'), 
         ('tested', 'Tested'), 
         ('delivered', 'Delivered') 
     ) 

    status_type = models.CharField( 
    max_length=11, 
    choices=CHOISES, 
    primary_key=True) 

class Task(models.Model):
    name = models.CharField(max_length=200, blank=False)
    status = models.ForeignKey(status)

我的观点的一部分:

def task_list(request):

    all_tasks = Task.objects.all()
    tasks = {}

    tasks['new'] = all_tasks.filter(status_id='new')
    tasks['in_progress'] = all_tasks.filter(status_id='in_progress')
    tasks['on_review'] = all_tasks.filter(status_id='on_review')
    tasks['tested'] = all_tasks.filter(status_id='tested')
    tasks['delivered'] = all_tasks.filter(status_id='delivered')
....

我的模板的一部分:

{% for item in new %}
    <div id="{{ item.pk }}">
        {{ item.name }}
    </div>
{% endfor %}
</div>
{% for item in in_progress %}
    <div id="{{ item.pk }}">
        {{ item.name }}
    </div>
{% endfor %}  
.....      

问题是,有没有办法优化我的所有查询集,或者为一个db调用选择五个过滤器是不可能的?
就像我理解的那样,如果我只在视图中保存这个调用all_tasks = Task.objects.all()然后将逻辑放在模板中,就像这样:

{% for item in all_task %}
{% if item.status_id == "new" %}
....

这也将是五个电话 希望我的问题不是太宽泛

2 个答案:

答案 0 :(得分:4)

只需按视图中的状态对您的任务进行分组:

from itertools import groupby

def task_list(request):
    all_tasks = Task.objects.select_related('status').order_by('status')
    tasks = {status: list(tasks)
             for status, tasks
             in groupby(all_tasks, lambda x: x.status)}

并在模板中使用它们,如:

{% for task in tasks.new %}
  {{ task }}
{% endfor %}

答案 1 :(得分:2)

一种可能性是改变你的CHOICES(那里的拼写错误)以映射到有序排序的东西,例如整数。

然后使用orderby执行单个查询,并在模板中使用ifchanged标记。

无论您尝试什么,请注意不要陷入在Django中实现SQL逻辑的陷阱,只是为了避免额外的查询。

无论如何,我建议你使用像django-debug-toolbar这样的东西来掌握任何替代方案的时间。

相关问题