2011-09-28 12 views
0

데이터 저장소에 ~ 850 개의 그룹과 ~ 19,000 개의 항목이 있습니다. 각 항목은 내가 그룹과 항목 표현 내 응용 프로그램의 두 가지 모델이, 하나 개의 그룹에 속할 수 있습니다 :GQL이 필터의 ReferenceProperty를 인식하지 못함

class Group(db.Model): 
    Id = db.IntegerProperty() 
    Name = db.StringProperty() 
    # ... some other properties 

class Item(db.Model): 
    Id = db.IntegerProperty() 
    Name = db.StringProperty() 
    Group = db.ReferenceProperty(Group, collection_name="groupItems") 
    # ... some other properties 

내가 특정 항목을 볼 수있는 데이터 저장소 관리를 사용할 수 있습니다 (즉 WHERE 식 (34)) 및 이 그룹에 올바르게 연결되어 있는지 볼 -

SELECT * FROM Item WHERE Id = 34 

이 나에게 다음과 같은 특성을 가진 그룹을 제공합니다

Decoded entity key: Group: id=10321 
Entity key: agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM 
Id: 18 

내가 얻을이 그룹에 대한 모든 항목을 검색하기 위해 내 GQL 쿼리를 변경하는 경우 결과가 없습니다! - 난 그냥 그룹을 검색 할 경우

SELECT * FROM Item WHERE Group = KEY('agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM') -- No Results 
SELECT * FROM Item WHERE Group = KEY('Group', 'agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM') -- No Results 

, 그것은 예상대로 작동 -이 똑같이 내 파이썬 코드에 적용

SELECT * FROM Group WHERE __key__ = KEY('agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM') -- Returns 1 Group 

합니다. 전화 :

group = Group.gql("WHERE Id = :1", 18).get() 
items = Item.gql("WHERE Group = :1", group).fetch(50) 

결과로 항목이없는 목록이 생성됩니다. 마찬가지로

group.groupItems.fetch(500) -- Returns no results 

내 질문은 - 나는 뭔가 어리석은 짓을하고 있는가? 비슷한 구조의 더미 프로젝트를 작성하여 이름 지정 문제가 아니라는 것을 증명해주었습니다 (즉, 그룹은 예약어가 아닙니다). (관심이있는 경우 첨부).

내가 뭘 잘못하고 있니?

편집 1 : 요청으로

, 여기에 생성 코드입니다. Reader는 BLOB 저장소에 저장된 CSV를 여는 csv 판독기 (inbuilt csv 라이브러리 사용)입니다. 모든 의도와 목적을 위해 단순히 CSV 파일을 구문 분석합니다. 상술 한 바와 같이. 내 대시 보드를 통해 데이터 뷰어에서 그룹에 올바르게 바인딩 된 항목 (그룹이 항목 옆에 나열되어 있으며 해당 링크를 클릭하여 그룹을 볼 수 있음) 그러나 그룹을 필터의 일부로 항목에 전달할 때 결과가 없습니다 반환 -

그룹 -

reader = UploaderBase().open_from_blobstore(Settings().get_group_csv_key()) 
upNum = 0 
groupsToPut = [] 
for row in reader: 
    group = Group(Id=int(row[0])) 
    group.Name = row[2] 
    groupsToPut.append(group) 

db.put(groupsToPut) 

아이템 - 당신이 데이터를 삽입 할 때

groupCache = {} 
for group in Group.all().fetch(1000): 
    groupCache[group.Id] = group 
logging.info("Cached %d group entries locally" % len(groupCache)) 

items = [] 
reader = UploaderBase().open_from_blobstore(Settings().get_items_csv_key()) 
upNum = 0 
for row in reader: 
    logging.debug("Adding row %d" % upNum) 
    item = Item(Id=int(row[0])) 

    if not row[1] is None and row[1] != "": 
     item.Group = groupCache[int(row[1])] 

    item.Name = row[2] 
    items.append(item) 

db.put(items) 
+0

실제로 Item.Group 필드에 저장하는 것과 관련된 문제가있는 것처럼 보입니다. 엔티티 생성 코드를 게시 할 수 있습니까? –

+0

'Id'속성을 기반으로 필터링하려고 시도했지만 'Id'속성 (34)의 값이 아닌 키 (18)의 ID를 전달하면 Python 코드가 작동하지 않습니다. ID 속성을 완전히 삭제하고 데이터 스토어에서 생성 된 ID 또는 키 이름 만 사용하면됩니다. –

+1

일치하는 레코드가 없기 때문에 단순히 GQL 문이 성공하지 못하는 것 같습니다.일치해야한다고 생각하는 레코드를 검색하고 Group 속성을 확인하려고 시도 했습니까? 또 하나의 가능성은 데이터를로드 할 때 속성을'indexed = False'로 설정했다는 것입니다. –

답변

1

가장 가능성있는 설명은, 참조 속성은 indexed=False로 설정된다. 모델 변경은 모델이 변경된 후에 작성된 엔티티에만 영향을 미치므로 해당 열에 대해 색인이 사용되지 않는 동안 삽입 된 행에는 색인 행이 없습니다.

관련 문제