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