如何表达;或;在django的字典查询集中

如何表达;或;在django的字典查询集中,django,filter,sorting,Django,Filter,Sorting,我正在根据属性过滤大量用户。例如,它们可以通过最小gpa进行过滤 到目前为止,我一直在做以下工作来构建我的queryset- ('gpa_gt'仅表示gpa属性必须大于查询参数的值) 现在,用户有第一个学校专业属性和第二个学校专业属性。如果我按专业筛选,如果用户的第一个专业或第二个专业与我的任何选择相匹配,我希望用户显示在结果中(我在筛选中使用多选)。我现在只对一个专业有用- if request.GET.has_key('major'): kwargs['maj

我正在根据属性过滤大量用户。例如,它们可以通过最小gpa进行过滤

到目前为止,我一直在做以下工作来构建我的queryset-

('gpa_gt'仅表示gpa属性必须大于查询参数的值)

现在,用户有第一个学校专业属性和第二个学校专业属性。如果我按专业筛选,如果用户的第一个专业或第二个专业与我的任何选择相匹配,我希望用户显示在结果中(我在筛选中使用多选)。我现在只对一个专业有用-

    if request.GET.has_key('major'):
            kwargs['major__in'] = request.GET.getlist('major')

我知道如何显式地写出查询,但在我的例子中,我是在动态地构建它,并且对如何这样做感到困惑。感谢您的帮助,谢谢

到目前为止,我一直在考虑这个问题-(课程是专业)

“当然”就是我们所说的专业。我还没有检查上述方法是否有效,但这只是一个开始


帮忙?哈哈

到目前为止,我一直在想这个-(专业课程)

“当然”就是我们所说的专业。我还没有检查上述方法是否有效,但这只是一个开始


帮忙?lol

您在Django查询集中包含

您可以像操作变量一样对其进行操作,因此您需要类似以下内容:

query = Q( gpa__gt=request.GET['mingpa'] )
if request.GET.has_key('major'):
    query = query | Q( major__in=request.GET.getlist('major') )
profiles = BlahUser.objects.get( query )

在Django QuerySet中,您包括

您可以像操作变量一样对其进行操作,因此您需要类似以下内容:

query = Q( gpa__gt=request.GET['mingpa'] )
if request.GET.has_key('major'):
    query = query | Q( major__in=request.GET.getlist('major') )
profiles = BlahUser.objects.get( query )

Borgar无疑走在了正确的轨道上,但我认为这与你的情况有点接近 寻找:

# filter for minimum GPA
gpa_filter = Q( gpa__gt=request.GET['mingpa'] )
major_filter = Q()

if request.GET.has_key('major'):
    majors = request.GET.getlist('major')
    # filter for students with first OR second major in specified majors
    major_filter = Q( first_major__in=majors| Q(second_major__in=majors)

# run filter (these are AND'ed together), so we get students that:
# 1. Have a first or second major in the specified list of majors AND
# 2. Have a GPA above the specified minimum
profiles = BlahUser.objects.get( gpa_filter, major_filter )
请注意,您可以继续使用
配置文件
作为常规查询集(如本示例所示):


因此,只要在需要的地方使用Q对象,然后继续正常地在queryset上操作。

Borgar肯定走上了正确的道路,但我认为这与您的实际情况有点接近 寻找:

# filter for minimum GPA
gpa_filter = Q( gpa__gt=request.GET['mingpa'] )
major_filter = Q()

if request.GET.has_key('major'):
    majors = request.GET.getlist('major')
    # filter for students with first OR second major in specified majors
    major_filter = Q( first_major__in=majors| Q(second_major__in=majors)

# run filter (these are AND'ed together), so we get students that:
# 1. Have a first or second major in the specified list of majors AND
# 2. Have a GPA above the specified minimum
profiles = BlahUser.objects.get( gpa_filter, major_filter )
请注意,您可以继续使用
配置文件
作为常规查询集(如本示例所示):


所以,只要在需要的地方使用Q对象,然后继续正常地对queryset进行操作。

两个问题-1)这需要我将所有查询构建转换为使用Q,对吗?如果我有多个“大于”的查询,我必须说query=Q(gpa\uu gt=request.GET['mingpa'])query=query&Q(sat\u gt=request.GET['minsat'])。这意味着我需要在主“or”查询周围加上括号。你会怎么做?2) 从你的头顶,我可以使用上面的对象。过滤器权利?更明确地说,BlahUser.objects.filter(query)我可能弄错了,但我认为您的示例将包括所有GPA高于指定最小值的学生,以及任何指定专业的学生,无论GPA如何,由于您将Q对象与“或”组合在一起,因此我认为仅提供一个包含或+文档链接的基本示例就足以让事情进展顺利。这次我真的没有耐心去追求完整性。:-)有两个问题-1)这需要我将所有查询构建转换为使用Q,对吗?如果我有多个“大于”的查询,我必须说query=Q(gpa\uu gt=request.GET['mingpa'])query=query&Q(sat\u gt=request.GET['minsat'])。这意味着我需要在主“or”查询周围加上括号。你会怎么做?2) 从你的头顶,我可以使用上面的对象。过滤器权利?更明确地说,BlahUser.objects.filter(query)我可能弄错了,但我认为您的示例将包括所有GPA高于指定最小值的学生,以及任何指定专业的学生,无论GPA如何,由于您将Q对象与“或”组合在一起,因此我认为仅提供一个包含或+文档链接的基本示例就足以让事情进展顺利。这次我真的没有耐心去追求完整性。:-)
# filter for minimum GPA
gpa_filter = Q( gpa__gt=request.GET['mingpa'] )
major_filter = Q()

if request.GET.has_key('major'):
    majors = request.GET.getlist('major')
    # filter for students with first OR second major in specified majors
    major_filter = Q( first_major__in=majors| Q(second_major__in=majors)

# run filter (these are AND'ed together), so we get students that:
# 1. Have a first or second major in the specified list of majors AND
# 2. Have a GPA above the specified minimum
profiles = BlahUser.objects.get( gpa_filter, major_filter )
seniors_matching_request_params = profiles.filter(status='senior')