Django模型过滤器在一个项目上很慢
问题描述:
我有一个项目模型,它具有FK到组模型。组具有名称和其他两个字段:(布尔型)is_private指示该组是否是私有的,而FK是指向django.auth.models.Group以指示该项目组可见的组成员身份。Django模型过滤器在一个项目上很慢
有100个项目,他们愉快地获取在不到1秒:
def project_list(request):
parameters = {field_name: value for field_name, value in request.GET.items() if value and field_name in project._meta.get_all_field_names()}
all_projects = project.objects.select_related().filter(**parameters)
return all_projects
只有一个项目,一个私人组,只要我添加隐私检查,取它采取更多比4秒做:
def project_list(request):
parameters = {field_name: value for field_name, value in request.GET.items() if value and field_name in project._meta.get_all_field_names()}
all_projects = project.objects.select_related().filter(**parameters)
for p in all_projects.filter(group__is_private = True):
if not request.user.groups.filter(name = p.group.private_group.name).exists():
all_projects = all_projects.exclude(id=p.id)
return all_projects
有没有办法重做这个以减少时间?
答
在下面的代码你在每次迭代取单group
,所以你正在做大量的数据库查询这会减慢速度:
all_projects = project.objects.select_related().filter(**parameters)
for p in all_projects.filter(group__is_private = True):
if not request.user.groups.filter(name = p.group.private_group):
如果你想获取不带私人团体或项目只有民间团体,如果用户是该组中,然后使用:
from django.db.models import Q
def project_list(request):
parameters = {field_name: value for field_name, value in request.GET.items() if value and field_name in project._meta.get_all_field_names()}
group_ids = request.user.groups.values_list('id', flat=True)
all_projects = project.objects.select_related().filter(**parameters)
all_projects = all_projects.filter(Q(group__is_private=False) | Q(group__is_private=True, group_id__in=group_ids))
return all_projects
不是我想选择与私人团体唯一项目 - 我想选择所有项目,但如果有与私人团体项目,我想他们是仅在请求用户是第一个成员时才列表e project_group_(FK)_private_group – abolotnov 2012-02-25 00:04:03
我修改了代码以反映这一点。我使用[Q查询](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects)来过滤“(组非私人)或(组私人)和用户有该组)“ – 2012-02-25 00:07:10
第二个选项会做,谢谢! – abolotnov 2012-02-25 00:07:39