我想在django中使用带有OR条件的过滤器。为此,我想使用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 )
但是同样的错误发生了,我不能理解到底是什么问题
发布于 2016-10-07 00:43:45
您可以将get方法的默认值设置为None以外的其他值,例如空字符串:
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?
发布于 2016-10-07 00:44:10
您可以在循环中构建Q对象,丢弃所有为none的值。请注意,经过考虑,似乎永远不会到达您的except,因为如果Get参数不存在,get将简单地返回None。因此,您可以用if替换try。
下面的代码假设您只是希望在筛选器中忽略未设置的值。
(这是未经测试的--如果您有任何问题,请告诉我。)
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)发布于 2016-10-07 00:45:57
您的错误似乎意味着您的某个值为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))https://stackoverflow.com/questions/39901266
复制相似问题