Django - 如何使用get参数构建通用的聪明URL

时间:2015-03-05 21:33:17

标签: python django url-routing

这是使用带有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框架的模块视图,它允许所有这些没有编码。

1 个答案:

答案 0 :(得分:0)

首先,在网址中,它们并不合逻辑,而且&符号(&)只是界定了网址中的键/值对。

考虑到这一点,有两种方法可以解决这个问题:

  1. 将值固定到URL中的逗号列表中并解析python中的值,所以:

    鉴于此网址:/?group=20548110&sexes=1,2

        if 'sexes' in request.GET:
            sexes = request.GET['sexes'].split(',')
            # Do something with sexes
            success = True
    
  2. 使用重复的网址,并使用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请求中。

  3. 最后,关于搜索50个字段,您似乎正在尝试构建某种搜索。在数据库中搜索50个字段将是昂贵且缓慢的。您可以考虑将搜索引擎与django, such as Haystack` (which is amazing)一起使用,或者如果您希望过滤,请根据用户反馈将数量限制为可管理的数量。