3

비 관계형 데이터베이스에서 외래 키의 속성을 기반으로 필터링하는 것이 가장 좋은 방법은 무엇입니까? join 지원이 부족하다는 점이 상황을 더욱 복잡하게 만든다는 것을 이해하며 다른 사람들이 어떻게 접근했는지 궁금합니다.django-nonrel의 foreign key 속성에 대한 필터

필자의 경우 지역에 속한 사이트에 속한 이벤트가 있습니다. 주어진 지역의 모든 이벤트를 필터링하고 싶습니다. site__region가 join을 필요로하기 때문에,

region = Region.objects.get(id=regionID) 
events = Event.objects.filter(site__region=region) 

이 작동하지 않는 그것은에 지원되지 않는 :는 Event은 차례로 Regionregion 외래 키가있는 Site에 외래 키, 인 site 속성이 있습니다 django-nonrel은 Google App Engine에서 실행됩니다. (I 오류로 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) 

이 일을 일이 될 수있는 좋은 방법입니다? 내가 간과 한 바보 같은 것이 있습니까? 미리 감사드립니다!

답변

8

사이트 및 지역을 역 참조하므로 많은 비효율적 인 솔루션입니다. 이것은 DB에서 100 개의 이벤트 이상으로 확장되지 않습니다.

가장 좋은 해결책은 데이터를 복사하여 데이터를 비정규 화하는 것입니다. save()에 대한 이벤트의 ID입니다. 그런 다음 Event.objects.filter (region_id = regionID)를 직접 수행 할 수 있습니다. 결과 코드가 덜 깨끗하고 유지 보수가 가능해 지지만 비 관계형 DB에서 작동하는 방식은 입니다.입니다.

내가 할 수있는 말은 다음과 같습니다. 가능한 경우 1 월 말까지 기다려주세요. ;)

+0

인가 : 이미 dbindexer 사용하는 경우 http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

당신은 단순히 같은 것을 사용하여 인덱스를 등록해야합니까? 그들은 항상 "연말"을 인용하고 연말은 결코 끝나지 않는 것처럼 보입니다. : P – munchybunch

+0

오우 와우, 당신은 장고연의 개발자 야!? 정말 대단합니다. 모든 작업에 감사드립니다. 1 월을 고대하고 있습니다 ... – munchybunch

1

1 월이 끝났으며 이제 dbindexer가 간단한 JOINS를 지원합니다. 당신은 여기에 대해 읽을 수 있습니다 : 월 부분이 GAE에 SQL 데이터베이스에 대한 참조

# photo/dbindexes.py: 

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

register_index(Event, {'site__region': StandardLookup(),}) 
관련 문제