Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 德扬戈。如何优化数据库查询?_Django_Database_Django Queryset - Fatal编程技术网

Django 德扬戈。如何优化数据库查询?

Django 德扬戈。如何优化数据库查询?,django,database,django-queryset,Django,Database,Django Queryset,我有两种型号: class Status(models.Model): CHOISES = ( ('new', 'New'), ('in_progress', 'InProgress'), ('on_review', 'OnReview'), ('tested', 'Tested'), ('delivered', 'Delivered') ) status_t

我有两种型号:

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 %}  
.....      
也将有五个电话

希望我的问题不要太宽泛

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

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 %}

一种可能是更改您的
选择(输入错误)以映射到排序中有意义的内容,例如整数

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

无论您尝试了什么,都要小心不要落入在Django中实现SQL逻辑的陷阱,因为这只是为了避免额外的查询


在任何情况下,我都建议您使用类似于掌握时间的方法来进行任何选择。

太好了!非常感谢。也许这是个愚蠢的问题,但我现在如何才能在模板中获取任务对象呢?我不需要订购清单,一个接一个的物品。我需要为每个状态将对象放在五列中,就像在trello.com中一样,所以我需要一些条件。如果我使用
{%If%}
标记检查状态名称,它仍然是db call?Queryset应该是
Task.objects。选择与任务相关的('status')。排序依据('status')
。在这种情况下,将不会有额外的数据库查询。
{% for task in tasks.new %}
  {{ task }}
{% endfor %}