过滤django-nonrel中的外键属性

时间:2010-12-27 20:38:42

标签: django google-app-engine non-relational-database django-nonrel

基于非关系型数据库中的外键属性进行过滤的最佳实践是什么?我知道缺乏join支持会使事情变得更复杂,所以我想知道其他人是如何解决它的。

就我而言,我有属于区域的属于区域的事件。我想过滤给定区域中的所有事件。 Event具有site属性,该属性是Site的外键,后者又具有region的{​​{1}}外键:

Region

这不起作用,因为site__区域需要region = Region.objects.get(id=regionID) events = Event.objects.filter(site__region=region) ,并且在Google App Engine上运行的django-nonrel不支持。 (我将join视为错误。)因此,我一直在迭代事件,添加与列表匹配的事件:

Caught DatabaseError while rendering: This query is not supported by the database.

这是做事的好方法吗?有什么傻事我忽略了吗?提前谢谢!

2 个答案:

答案 0 :(得分:8)

这是一个非常低效的解决方案,因为您取消引用站点和区域,导致大量查询。这不会扩展到数据库中可能超过100个事件。

最佳解决方案是通过复制例如非常规化您的数据。将该区域的id转换为save()上的Event。然后你可以直接做Event.objects.filter(region_id = regionID)。生成的代码变得不那么干净和可维护,但这就是非关系数据库的工作方式,今天

我现在可以说的是:如果可以,请等到1月底。 ;)

答案 1 :(得分:1)

1月已经过去,dbindexer现在支持简单的JOINS。你可以在这里阅读:http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

如果您已经在使用dbindexer,则只需使用以下内容注册索引:

# photo/dbindexes.py:

from models import Event
from dbindexer.lookups import StandardLookup
from dbindexer.api import register_index

register_index(Event, {'site__region': StandardLookup(),})