在Django queryset for OR中使用Q对象时发生了条件错误

2024-09-30 08:17:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在django中使用带或条件的过滤器。 为此,我想使用Q对象。 我的代码是这样的

def product(request):
    try:

        proTitle = request.GET.get('title')
        ProDescription = request.GET.get('description')


    except:
        pass


    list0 = []
    result = Product.objects.filter(Q(title__contains=proTitle ) | Q(description__contains=ProDescription ) )

    for res in result:

        list0.append(res.project_id)
    data ={'title result':list0}
    return HttpResponse(json.dumps(data))



return HttpResponse(json.dumps(data), content_type='application/json')

当传递所有值时,proTitle,ProDescription it working fine. If any value is going to none it encounter a error不能将None用作查询值` 为什么在查询集中使用OR运算符时发生此错误

我也试试这个

result = Project.objects.filter(title__contains=proTitle) | Project.objects.filter(description__contains=ProDescription )

但同样的错误发生了 我不明白到底是什么问题


Tags: jsondatagetobjectstitlerequestresdescription
3条回答

您可以在一个循环中构建Q对象,丢弃所有不存在的值。请注意,经过考虑,您的except似乎永远无法到达,因为如果Get参数不存在,get将只返回None。因此,您可以将try替换为if。在

下面的代码假设您只想在过滤器中忽略未设置的值。在

(这是未经测试的,如果您有任何问题,请告诉我。)

attributes = (('title', 'title__contains'),
              ('description', 'description__contains'),
              ('funAria', 'functional_area__contains'),
              ('femaleReq', 'female_candidate'))

query_filter = Q() # initialize

for get_param, kw_arg in attributes:
    get_value = request.GET.get(get_param)
    if get_value:
        query_filter |= Q(**{ kw_arg: get_value })

result = Product.objects.filter(query_filter)

您可以将get方法的默认值设置为None以外的值,例如空字符串:

proTitle = request.GET.get('title', '')
ProDescription = request.GET.get('description', '')
funAria = request.GET.get('funAria', '')
femaleReq = request.GET.get('femaleReq', '')

然而,当使用__contains时,这很可能返回数据库中的所有结果。在

否则,您可以构建丢弃所有None值的Q函数。在

以此作为指导:How to dynamically compose an OR query filter in Django?

您的错误似乎意味着其中一个值是None

def product(request):
    try:

        proTitle = request.GET.get('title')
        ProDescription = request.GET.get('description')
        funAria = request.GET.get('funAria')
        femaleReq = request.GET.get('femaleReq')
        someIntValue = request.GET.get('someIntValue')

    except:
        pass

    allQs = Q()
    if proTitle is not None: 
        allQs |= Q(title__contains=proTitle )
    if ProDescription is not None:
        allQs |= Q(description__contains=ProDescription )         
    if funAria is not None:
        allQs |= Q(functional_area__contains=funAria )
    if someIntValue is not None:
        allQs |= Q(some_int_value__gte=someIntValue) # no need to convert someIntValue to an int here as long as you are guaranteed it is unique.
    allQs |= Q(female_candidate=femaleReq )
    list0 = []
    result = Product.objects.filter(allQs)
    for res in result:

        list0.append(res.project_id)
    data ={'title result':list0}
    return HttpResponse(json.dumps(data))

相关问题 更多 >

    热门问题