一种高效检索深度嵌套数据集的助手

django-unjoinif的Python项目详细描述


django unjoinify

a library for effective retrieving deep nested data set
(for people who are not bear of a bit of sql)


问题是,假设你有一个关于电影节的网站。每个节日都有许多奖项,
每个奖项都有许多提名。提名属于一部电影,一部电影可以有多个导演(多对多关系)。你想要有一个页面列出电影节提名影片的完整名单,包括他们的导演。


这是
错误。


select_related在这里对您没有帮助-它不能遵循一对多和
多对多的关系。(参见Django门票2238和6432。)



Tinseltown电影id作为提名电影id,
Tinseltown电影title作为提名电影title,
Tinseltown个人id作为提名电影导演id,
Tinseltown_person.first_name作为提名电影导演名字
Tinseltown_person.lash作为提名电影导演姓氏
来自
Tinseltown_award
Left join Tinseltown_nomination on(Tinseltown_award.id=Tinseltown_nomination.award_id)
Left join Tinseltown_movie on(Tinseltown_nomination.movie_id=tinseltown_movie.id)
左键加入tinseltown_movie_directors on(tinseltown_movie.id=tinseltown_movie_directors.movie_id)
左键加入tinseltown_person on(tinseltown_movie_directors.person_id=tinseltown_person.id)
哪里
tinseltown_award.festival_id=?
order by
tinseltown_award.name,
tinseltown_nomination.ranking

这将在单个查询中捕获页面所需的所有数据,但有一个缺点:返回的只是一个简单的sql结果表,无法访问模型对象及其精心编制的方法(请考虑获取绝对url)。

unjoinify为了挽救这个问题,如果您对列名使用了上面的双下划线符号,并使它们与关系名匹配,uncoinify将接受您的查询,并通过一些巧妙的orm内省,重建一个对象树:


awards=uncoinify(award,“select tinseltown_award.id…”,(festival_id,)

(这里award是所有连接挂起的基类,festival_id是查询的参数。)


几乎。由于django的orm的局限性,我们不能返回一个适当的
对象树来引用award.nominations等。相反,
你得到的是一组(奖项,提名)元组,其中提名
本身就是一组(提名,电影,导演)元组,导演是一组person对象。这对于在
>模板中进行迭代来说已经足够了,不过:


>{%for award,提名提名在奖项中的得奖率、提名在奖项中的得奖率%}
<;h1>;{{{awward.name}<;h1>;
<;lt;ul>;
{%for提名、电影、导演在提名中的得奖率、电影、导演在提名中的得奖率%}
><;li>;
{{{{nonomination.nomin提名在提名中的得奖率、电影、电影、导演在提名中的得奖率的得奖率%}



>
< gt;{{movie.title}<;{a>;
-{%对于directors%}
{director.first{director.lash}
{%endfor%}
<;{li>;
{%endfor%}
</ul>;
{%endfor%}

unjoinify甚至可以处理笛卡尔连接-例如,如果一部电影有
多个工作室和多个导演,您可以加入
关系,并成功地将其解压为
(提名、电影、导演、工作室)。你最好少用这个,
但是-这将导致为每部电影返回count(directors)*count(studios)行
,这取决于您的特定用例,最终可能会比运行单独的查询差得多…

数据库引擎对列
名称长度的限制相当低(postgres为63个字符),在处理深度嵌套关系时很容易遇到此限制。要解决此问题,可以将列名列表作为一个附加参数传递(顺序与查询中列名的出现顺序相同):


awards=unjoinify(award,sql,(festival戥id,),
columns=['id',name',nomination戥id',nomination戥ranking',nomination戥movie戥id',,“提名电影”标题])


author
----
matt west co tt<;matt@west.co.tt>;
http://matt.west.co.tt/-@westdotcodottt

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java