mun*_*nch 3 django google-app-engine non-relational-database django-nonrel
基于非关系数据库中的外键属性进行过滤的最佳实践是什么?我知道缺乏join支持会使事情变得更加复杂,所以我想知道别人是如何解决它的.
就我而言,我有属于区域的事件,属于区域.我想过滤给定区域中的所有事件.一个Event具有site属性,是一个外键的Site,这反过来有一个region外键到Region:
region = Region.objects.get(id=regionID)
events = Event.objects.filter(site__region=region)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为site__region需要a join并且在Google App Engine上运行的django-nonrel不支持.(我得到Caught DatabaseError while rendering: This query is not supported by the database.一个错误.)因此,我一直在迭代事件,添加匹配列表的事件:
events = list()
region = Region.objects.get(id=regionID)
for event in Event.object.all():
if event.site.region==region:
events.append(event)
Run Code Online (Sandbox Code Playgroud)
这是做事的好方法吗?有什么傻事我忽略了吗?提前致谢!
小智 8
这是一个非常低效的解决方案,因为您取消引用站点和区域,导致大量的查询.这不会扩展到数据库中可能超过100个事件.
最好的解决方案是通过将例如区域的id复制到save()上的Event来对数据进行非规范化.然后你可以直接做Event.objects.filter(region_id = regionID).生成的代码变得不那么干净和可维护,但这就是今天非关系数据库的工作方式.
我现在可以说的是:如果可以,请等到1月底.;)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |