在 Django 1.9 上,我有一个表单允许用户根据他们的输入过滤模型:
def get_queryset(self):
cvs = Clean.objects.all()
query = self.request.GET.get('q')
if query:
cvs = cvs.filter(Q(cvscore__gte=query)).distinct()
cvs = cvs.order_by('cvscore')
return cvs
我希望他们也能够搜索字符串并尝试过:
cvs = cvs.filter(Q(cvscore__gte=query) | Q(cv__icontains=query)).distinct()
问题是如果输入是一个str,就会抛出一个错误:
invalid literal for int() with base 10:
有解决办法吗?像这样的东西:
def get_queryset(self):
cvs = Clean.objects.all()
query = self.request.GET.get('q')
if query **is an integer**:
cvs = cvs.filter(Q(cvscore__gte=query)).distinct()
cvs = cvs.order_by('cvscore')
else:
cvs = cvs.filter(Q(cv__icontains=query)).distinct()
return cvs
请您参考如下方法:
内部查询一切都是string。所以,你应该考虑使用 isdigit():
如果字符串中的所有字符都是数字并且至少有一个字符,则此方法返回 true,否则返回 false。 More Info
query = self.request.GET.get('q','') # Note this .get('q','')
if query.isdigit(): # i.e '31231' as string, will be True
cvs = cvs.filter(Q(cvscore__gte=int(query))).distinct()
cvs = cvs.order_by('cvscore')
else:
cvs = cvs.filter(Q(cv__icontains=query)).distinct()
