【问题标题】:Django - how to construct universal clever urls with get parametersDjango - 如何使用获取参数构造通用的聪明 url
【发布时间】:2015-05-07 10:21:20
【问题描述】:

这里是使用 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 语句 - 这很糟糕。我还需要检查每个字段的类型以构造正确的查询(句柄字符串、日期、数字等)

第三个,我想设置多个url值,例如/?group=20548110&sex=1,2 1,2 表示我想查询男性和女性。

那么:有没有一个 Django 模块可以解决所有这些问题? 与我的问题最相关的是 Drupal PHP 框架的模块视图,它允许所有这些而无需编码。

【问题讨论】:

    标签: python django url-routing


    【解决方案1】:

    首先,在 URL 中,它们不是逻辑“与”,与符号 (&) 只是在 URL 中分隔键/值对。

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

    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. 按照你应该做的那样使用重复的 URL 并使用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 一起进行 AND 运算,只是说明两个键/值都在 GET 请求中。

    最后,关于 50 个字段的搜索,您似乎正在尝试构建某种搜索。在数据库上搜索 50 个字段会昂贵且缓慢。您可以考虑使用带有django, such as Haystack` (which is amazing) 的搜索引擎,或者如果您想要过滤,请考虑根据用户反馈将数量限制在可管理的范围内。

    【讨论】:

    • 谢谢,这种方法很有效。当我谈到 50 个字段时,我的意思是能够使用和选择其中的几个,而不是一次全部。
    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2022-08-18
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多