2009-08-03 3 views
3

수준의 메시지는 "IN '쿼리와 GQL (db.Model) 구축 :.ReferenceProperty

user = db.ReferenceProperty(User, required=True, collection_name='Message_set') 
text = db.TextProperty(required=True) 

나는이하지만 난 GQL 문에 BadValueError납니다 시도를

사용자 =을 []

users.append (사용자 A)

users.append (사용자 B)

users.append (유저 C)

메시지 = Message.gql ("어디에서 사용 : 사용자의 사용자 = 사용자) .fetch (100)

답변

2

완전한 stacktrace (제발?) 없이는 말하기 어렵지만, IN이 키가 아닌 엔티티를 전달하는 것을 좋아하지 않는다고 생각합니다. 이 시도 :

users = [userA.key(), userB.key(), userC.key()] 
messages = Message.gql("WHERE user in :users", users=users).fetch(100 
2

GQL의 IN 연산자 실제로 루프가 하 같은 애플리케이션 레벨 파이썬 코드 합성 = 시리즈를 가져 와서 연결합니다. 이는 실제로 기본 저장소의 기능 중 일부가 아니기 때문에 불행히도 제한이 있습니다 (성능도 결코 좋지 않습니다). Python API에 포함시키려는 것이 훌륭한 설계 결정인지는 잘 모르겠지만 (자바 API에서는 중복되지 않았다고 생각합니다.), 그렇습니다. (Btw, != 연산자도 비슷한 문제가 있습니다).

왜 이것이 의도 된 사용을 방해해야하는지 잘 모르겠습니다 만, "쿼리"개체가 일반 datastore가 아닌 datastore.MultiQuery의 인스턴스로 인해 의심됩니다. 쿼리 - GAE에서 제공하는 응용 프로그램 수준의 Python 코드가 일반적으로하는 일은 응용 프로그램 수준의 Python 코드에서 수행합니까? SDK 소스 파일 google/appengine/api/datastore.py, 특히 MultiQuery 클래스를 참조하십시오. 결국 모든 별도의 쿼리를 수행하고 결과를 병합하는 것으로 귀결됩니다 (필요한 경우 정렬 된 순서로 정렬되지만, 여기에있는 것처럼 보입니다).

0

사용자의 키 목록을 원하십니까? users.append (userA.key())를 시도하십시오. 사용자 참조 속성의 값은 사용자 엔터티에 대한 키입니다.

1

을이 모델 :

class MyUsuario(db.Model): 
    nombre=db.StringProperty(required=True) 

class Message(db.Model): 
    MyUsuario = db.ReferenceProperty(MyUsuario, required=True, collection_name='Message_set') 
    text = db.StringProperty(required=True) 

이 코드는 작동합니다

from modelos import MyUsuario, Message 
from google.appengine.ext import db 

usuarios=MyUsuario.all() 

userA=usuarios[0] 
userB=usuarios[1] 
userC=usuarios[2] 

usuarios= [] 

usuarios.append(userA.key()) 
usuarios.append(userB.key()) 
usuarios.append(userC.key()) 

messages = db.GqlQuery('select * from Message Where MyUsuario In :usuari', usuari=usuarios) 

for message in messages: 
    print message.text 

은 내가 awnser을 보았다 in this google groups post

관련 문제