【问题标题】:handling multiple returned objects处理多个返回的对象
【发布时间】:2010-12-13 22:22:10
【问题描述】:

我有一个联系人/地址应用程序,允许用户在数据库中搜索联系人条目。当前视图将返回一个对象 (Entry()) 并显示其字段。代码如下:

def search_page(request): 
    form = SearchForm() 
    entrylinks = [] 
    show_results = True 
    if request.GET.has_key('query'): 
        show_results = True 
        query = request.GET['query'].strip() 
        if query:
            form = SearchForm({'query' : query}) 
            entrylinks = \
                Entry.objects.filter (name__icontains=query)[:10] 
    variables = RequestContext(request, { 'form': form, 
        'entrylinks': entrylinks, 
        'show_results': show_results
    }) 
    return render_to_response('search.html', variables)

我想在视图中添加一个“if”语句,以识别何时返回多个对象(数据库中具有相同名称的人),在这种情况下,将返回的对象转移到不同的模板(这将简单地列出返回的对象,以便用户可以选择他/她喜欢的对象)。谁能展示这样的声明会是什么样子?谢谢。

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    您应该使用 entrylinks.count(),而不是使用 len(entrylinks)。内置的 count 方法速度更快,可以为您节省数据库查询。

    【讨论】:

    • entrylinks.count() 不会导致 另一个 数据库查询吗? count() 在幕后做了一个 SELECT COUNT(*) ...
    • 同意米帕迪。在这种情况下,len 实际上更有效,因为无论如何您都需要在模板中评估查询集。
    【解决方案2】:

    Entry.objects.filter(一个QuerySet)返回的对象是有长度的,也就是说你可以调用len(entrylinks)来获取返回的记录数。因此,您可以执行以下操作:

    if len(entrylinks) == 1:
        tpl = "search.html"
    else:
        tpl = "select.html"
    variables = RequestContext(request, {
        "form": form,
        "entrylinks": entrylinks,
        "show_results": show_results,
    })
    return render_to_response(tpl, variables)
    

    【讨论】:

    • 太棒了。非常感谢 mipadi。赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多