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 
+0

不是我想选择与私人团体唯一项目 - 我想选择所有项目,但如果有与私人团体项目,我想他们是仅在请求用户是第一个成员时才列表e project_group_(FK)_private_group – abolotnov 2012-02-25 00:04:03

+0

我修改了代码以反映这一点。我使用[Q查询](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects)来过滤“(组非私人)或(组私人)和用户有该组)“ – 2012-02-25 00:07:10

+0

第二个选项会做,谢谢! – abolotnov 2012-02-25 00:07:39