首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django查询集中使用Q对象时,出现OR条件错误

在django查询集中使用Q对象时,出现OR条件错误
EN

Stack Overflow用户
提问于 2016-10-07 00:31:20
回答 3查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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 )

但是同样的错误发生了,我不能理解到底是什么问题

EN

回答 3

Stack Overflow用户

发布于 2016-10-07 00:43:45

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

代码语言:javascript
复制
proTitle = request.GET.get('title', '')
ProDescription = request.GET.get('description', '')
funAria = request.GET.get('funAria', '')
femaleReq = request.GET.get('femaleReq', '')

但是,在使用__contains时,这可能会返回DB中的所有结果。

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-10-07 00:44:10

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

下面的代码假设您只是希望在筛选器中忽略未设置的值。

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

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2016-10-07 00:45:57

您的错误似乎意味着您的某个值为None

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39901266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档