在django-nonrel中的外国钥匙属性过滤
-
13-10-2019 - |
题
根据非关系数据库中外国密钥的属性过滤的最佳实践是什么?我了解缺乏 join
支持使事情变得更加复杂,因此我想知道其他人是如何解决的。
就我而言,我有属于区域的网站的事件。我想过滤给定区域中的所有事件。一个 Event
有个 site
财产是一个外国钥匙 Site
, ,这又有一个 region
外国钥匙 Region
:
region = Region.objects.get(id=regionID)
events = Event.objects.filter(site__region=region)
这是行不通的,因为站点__ Rengion需要一个 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)
这是做事的好方法吗?我忽略了一些愚蠢的东西吗?提前致谢!
解决方案
这是一个非常低效的解决方案,因为您取消站点和区域会引起很多查询。这不会超出您的DB中的100个事件。
最好的解决方案是通过将区域的ID复制到save()上的事件中来使您的数据义。然后,您可以直接执行event.objects.filter(region_id = regionId)。最终的代码变得更加干净和可维护,但这就是事物在非关系DB上的工作方式, 今天.
我现在只能说:如果可以的话,请等到1月底。 )
其他提示
一月已经过去了,dbIndexer现在支持简单的连接。您可以在这里阅读: 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(),})