这是使用带有3个GET参数的Django 1.6.10视图。
def list_groupmembers(request):
success = False
criteria = {}
if 'group' in request.GET:
criteria['member_of_group'] = int(request.GET['group'])
#vkusers = Vkuser._get_collection().find({"member_of_group": int(request.GET['group'])})#Vkuser.objects(__raw__={'sex': 1})
success = True
if 'sex' in request.GET:
criteria['sex'] = int(request.GET['sex'])
#vkusers = Vkuser._get_collection().find({"member_of_group": int(request.GET['group']), 'sex': int(request.GET['sex'])})# 62740364 81099158
success = True
if 'music_artist' in request.GET:
criteria['my_music'] = {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
print(criteria)
vkusers = Vkuser._get_collection().find(criteria)
ctx = {'vkuser_list': vkusers, 'success': success}
return render_to_response('blog/vkuser_list.html', ctx, context_instance = RequestContext(request))
View可以处理/?group=20548110&sex=1&music=Beatles
等网址,其结果显示所有用户,属于组编号20548110,女人,就像披头士音乐。
这里的问题是url对与逻辑'AND'连接,但如果我想要逻辑'OR',我需要改变代码。
另一个问题是我想要数据库表中所有字段的过滤器,不仅仅是3.我有50个字段,所以我需要写50个if语句 - 那很糟糕。此外,我需要检查每个字段的类型,以构建正确的查询(句柄字符串,日期,数字等)
第三,我想设置多个网址值,例如/?group=20548110&sex=1,2
1,2意味着我想要查询男女。
那么:是否有一个Django模块可以解决所有这些问题? 与我的问题最相关的是Drupal PHP框架的模块视图,它允许所有这些没有编码。
答案 0 :(得分:0)
首先,在网址中,它们并不合逻辑,而且&符号(&
)只是界定了网址中的键/值对。
考虑到这一点,有两种方法可以解决这个问题:
将值固定到URL中的逗号列表中并解析python中的值,所以:
鉴于此网址:/?group=20548110&sexes=1,2
if 'sexes' in request.GET:
sexes = request.GET['sexes'].split(',')
# Do something with sexes
success = True
使用重复的网址,并使用getlist
提取它们,所以:
鉴于此网址:/?group=20548110&sex=1&sex=2
if 'sex' in request.GET:
sexes = request.GET.getlist('sexes') # This will return [1,2]
# Do something with sexes
success = True
注意,在上面的内容中,sex=1&sex=2
并不是和1和2,只是声明两个键/值都在GET请求中。
最后,关于搜索50个字段,您似乎正在尝试构建某种搜索。在数据库中搜索50个字段将是昂贵且缓慢的。您可以考虑将搜索引擎与django, such as Haystack` (which is amazing)一起使用,或者如果您希望过滤,请根据用户反馈将数量限制为可管理的数量。