2011-04-27 5 views
2

나는 한 다음 2 개 클래스 :두 GQL 클래스에서 데이터를 추출하는 방법은 무엇입니까?

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    fileHash = db.StringProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True)  
내가 두 테이블에서 데이터를 반환하는 GQL 쿼리 작성해야

:

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

을하지만 fileHashadded 필드 외에 각 item,해야 두 번째 클래스의 필드 - titlefile을 포함합니다 (일치는 fileHash 필드로 수행되어야 함).

답변

4

Datastore에서 동일한 GQL 선택 문을 사용하여 다양한 유형을 검색 할 수있는 방법이 없습니다.

또 다른 옵션은 이런 식으로 코드를 리팩토링, UsersRSSFiles간에 다 대일 관계를 만들 수 ReferenceProperty을 사용하는 것입니다 :이 방법으로

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    file = db.ReferenceProperty(Files) 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

Files 속성이 자동으로 역 참조 할 것 item.file.title 점 표기법 사용 : ReferenceProperty의 RPC 오버 헤드에서 응용 프로그램을 저장하려면

for item in items: 
    print item.UserID 
    print item.Added 
    print item.file.title #This costs an additional RPC call to Datastore 

은 상록 북극에 봐 le ReferenceProperty prefetching.

+1

감사합니다. 그런 접근 방식으로'FilesRS'를'UsersRSS'에 어떻게 추가할까요? 'file = Files (key_name = "z"+ self.request.get ('hash')); file.put(); fileRecord = UsersRSS(); fileRecord.file = file; fileRecord.put()'이 올바른 접근법입니까? –

+0

맞아, 아마도'fileRecord.put()'전에'userId'를'fileRecord'로 설정하는 것을 잊었을 것입니다. – systempuntoout

관련 문제