我正在尝试按列表过滤查询集 我通过
将unicode数据转换为1,4,5,6的格式category = request.GET.getlist(category')
print type(category)
data = Leads.objects.filter(item_required__id= category )
然后我收到错误
invalid literal for int() with base 10: '1,4'
那么我该如何解决这个问题。
Traceback:
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/cp/Documents/myshopup/markatix/customapi/vendors.py" in CustomerRequirements
365. cust_leads = CustomerLeads.objects.filter(item_required__id__in= category ).values('customer_name','budget','event','posting_date','quantity','other','fb_id','image','title').order_by('-posting_date')
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method
127. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/query.py" in filter
679. return self._filter_or_exclude(False, *args, **kwargs)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
697. clone.query.add_q(Q(*args, **kwargs))
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
1310. clause, require_inner = self._add_q(where_part, self.used_aliases)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q
1338. allow_joins=allow_joins, split_subq=split_subq,
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_filter
1209. condition = self.build_lookup(lookups, col, value)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_lookup
1102. return final_lookup(lhs, rhs)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/lookups.py" in __init__
105. self.rhs = self.get_prep_lookup()
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/lookups.py" in get_prep_lookup
143. return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_lookup
729. return [self.get_prep_value(v) for v in value]
File "/home/cp/Documents/envMyShopUp/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_value
985. return int(value)
Exception Type: ValueError at /customapi/vendor/customer-requirements/
Exception Value: invalid literal for int() with base 10: '1,4'
提前致谢。
答案 0 :(得分:0)
我做错了一些步骤。最后我找到了解决方案。
category = request.GET.get('category')
l1=[]
category_list =category.split(',')
for i in category_list:
a =int(i)
l1.append(a)
cust_leads = CustomerLeads.objects.filter(item_required__id__in= l1 )
答案 1 :(得分:0)
您还可以使用QueryDict.getlist
解析请求的查询参数列表:
from django.http.request import QueryDict
query = QueryDict('category=1&category=2')
categories = query.getlist('category') # -> ['1', '2']
leads = Leads.objects.filter(item_required__id__in=categories)
这样,用户可以通过逐个添加到查询中来为您提供类别列表。这个解决方案对你来说可能已经足够了。
但,您的用户(或您)可能希望提供免费的样式列表,并且它们可能在您的查询中有多个。在这种情况下,您必须获取所有列表,可以是主键列表,并将它们映射到可以在Django过滤器中使用的平面列表...
from itertools import chain
from django.http.request import QueryDict
query = QueryDict('categories=1,2,3&categories=4,5')
categories_strings = query.getlist('categories') # -> ['1,2,3', '4,5']
categories = list(chain.from_iterable(
map(lambda categories: categories.split(','), categories_strings))
) # -> ['1', '2', '3', '4', '5']
leads = Leads.objects.filter(item_required__id__in=categories)
幸运的是,对于我们来说,你可以很容易地把它写成一个整洁的小函数:
# Your myapp/utils.py module
from itertools import chain
# Python 3.5+ type type annotated function, you can use
# this without the type annotations in Python 2.7 as well
def get_query_list(querydict: QueryDict, key: str) -> list:
return list(chain.from_iterable(
map(lambda query: query.split(','), querydict.getlist(key)))
)
这就是它的工作原理:
from django.http.request import QueryDict
from myapp.utils import get_query_list
q = QueryDict('a=1&a=2&a=3,4')
get_query_list(q, 'a') # -> ['1', '2', '3', '4']
您可以在视图中使用它:
# Your myapp/views.py module
from myapp.utils import get_query_list
def my_view(request):
categories = get_query_list(request.GET, 'categories') # or 'category'
# ...
这是一种更冗长的方式,而不是使用单一查询参数代替列表,并支持多种不同的格式。
根据需要添加类型分类:
def my_view(request):
# A nice and neat one-liner
categories = get_query_list(request.GET, 'categories') # or 'category'
for item in categories:
try:
assert int(item)
except ValueError:
raise ValidationError('{} is not of correct type {}'.format(item, int))
# Everything should be parsed and validated
leads = Leads.objects.filter(item_required__id__in=categories)
在实施搜索或通用过滤器时,Django经常需要这种方法。