我正在使用带有Couchdb的Django框架,基于此处的示例: intro to using couchdb with django
我使用ad-hoc couchdb视图时没有遇到任何问题,但是当我用存储的视图替换它时,我没有找到任何结果。
例如,这有效:
def index(request):
docs = SERVER['docs']
all_pages = "function(d) { if ( (d.title.length>0) && (d.type=='otherpage') ) emit(d.title,d); }"
pages = [ x for x in docs.query(all_pages) ]
all_blogposts = "function(d) { if ( (d.title.length>0) && (d.type=='blogpost') ) emit([d.date,d.title],d); }"
blogposts = [ x for x in docs.query(all_blogposts) ]
return render_to_response('couch_docs/index.html',{'pages':pages,'blogposts':blogposts})
但是,这不是:
def index(request):
docs = SERVER['docs']
all_pages = docs.view('_view/example/all_pages')
pages = all_pages.rows()
all_blogposts = "function(d) { if ( (d.title.length>0) && (d.type=='blogpost') ) emit([d.date,d.title],d); }"
blogposts = [ x for x in docs.query(all_blogposts) ]
return render_to_response('couch_docs/index.html',{'pages':pages,'blogposts':blogposts})
当我进入Futon屏幕并选择example / all_pages视图时,它会返回多个文档。但是,当我尝试在Django中使用它时,它不返回任何结果。当我在python命令行执行此操作时,它也不会返回任何内容。看来我没有正确定义all_pages?如果我将其打印出来,则为以下内容:
<ViewResults <PermanentView '_view/example/all_pages'> {}>
所以,是的,它是空的。谁能看到我做错了什么?当我在Futon的“示例”下选择“all_pages”视图时,它返回结果没有问题。任何帮助表示赞赏。
P.S。所以我也尝试了这个教程:Snakes on a Couch!
我有同样的问题,即虽然我可以连接到Couch,启动Futon,创建数据库,文档和设计文档(在python命令行),然后看到它们(包括在Futon中),我无法得到从永久的观点回来的结果。我再次发现我可以从Futon内部运行视图(与在python命令行中创建的完全相同),并返回结果,但是当尝试使用python中的视图时,我没有得到任何结果。
因为这对于角色来说他们在教程中做了什么,我想这可能意味着我的代码没有问题,而是我的软件设置。关于什么作品最有可能出现问题的想法,或者如何追踪它?
答案 0 :(得分:1)
这可能会发生几种不同的原因。请记住,Futon会自动添加一些额外的参数,请尝试直接加载视图:
curl http://localhost:5984/docs/_design/example/_view/all_pages
如果确实加载了,那么Python代码就会出现问题。在python-couchdb中,语法为:
couchdb.Server(的 'http://本地主机:5984')[ '文档'] .view( '例如/ all_pages')
如果可行,那么与您与couchdb库的交互方式存在问题。
顺便说一下,[x表示任何东西的x]与使用列表构造函数相同,例如列表(任何)。
答案 1 :(得分:0)
这是有效的:
def index(request):
docs = SERVER['docs']
pages = [ x for x in docs.view("_design/example/_view/all_pages") ]
all_blogposts = "function(d) { if ( (d.title.length>0) && (d.type=='blogpost') ) emit([d.date,d.title],d); }"
blogposts = [ x for x in docs.query(all_blogposts) ]
return render_to_response('couch_docs/index.html',{'pages':pages,'blogposts':blogposts})
我不完全确定为什么会有效,因为我读过的示例和文档似乎表明我不需要_design和/或_view。但是,你知道,它有效,所以我会用它。也许这是在couchdb-python中的一些版本差异?