أنشئ GQL باستعلام "IN" لـ ReferenceProperty
-
10-07-2019 - |
سؤال
رسالة الفصل (db.Model):
user = db.ReferenceProperty(User, required=True, collection_name='Message_set')
text = db.TextProperty(required=True)
لقد حاولت ذلك ولكني أتلقى خطأ BadValueError في بيان gql.
المستخدمين = []
users.append(userA)
users.append(userB)
users.append(userC)
messages = message.gql('حيث يدخل المستخدم:المستخدمون', users=users).fetch(100)
المحلول
وانه من الصعب ان نقول دون تتبع مكدس الذاكرة المؤقتة كاملة (من فضلك؟)، ولكن اعتقد ان هذا IN لا يحب الكيانات يجري تمريرها بدلا من المفاتيح. جرب هذا:
users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
نصائح أخرى
ويتم تصنيعه المشغل IN
في GQL في الواقع من قبل كود بايثون مستوى التطبيق باعتباره حلقة عمل سلسلة من =
جلب ووصل منهم - انها ليست حقا جزءا من قدرات مخزن الأساسي وذلك لسوء الحظ تخضع لبعض القيود (و أدائها أبدا جيدة بوجه خاص). لست متأكدا من أنه كان قرارا تصميم كبير لإدراجه في API بيثون (وأعتقد لم تتكرر في API جافا)، ولكن، كنت هناك. (راجع للشغل، المشغل !=
لديه مشاكل مماثلة، أيضا).
وأنا لست متأكدا لماذا على وجه الخصوص وهذا ينبغي أن تتداخل مع استخدامك المقصود، ولكن أظن أن ذلك يرجع إلى كائن "استعلام" يجري مثيل datastore.MultiQuery بدلا من datastore.Query سهل - ماذا يحدث إذا قمت بذلك في الخاص كود بايثون مستوى التطبيق الخاص بك ما يفعله رمز بيثون مستوى التطبيق زودت GAE-عادة؟ انظر في مصادر SDK الخاص بك ملف جوجل / إلى AppEngine / المعهد / datastore.py، وتحديدا الطبقة MultiQuery - في النهاية انها تتلخص في القيام بجميع استعلامات منفصلة ودمج نتائجها (من أجل فرزها، إذا لزم الأمر، ولكن ذلك لا توجد الآن ' ر يبدو أن هذا هو الحال هنا).
مع هذه النماذج:
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
رأيت العون في منشور مجموعات جوجل هذا
وأعتقد أنك قد ترغب في قائمة مفاتيح المستخدمين؟ محاولة users.append (user.key ()). قيمة الممتلكات إشارة المستخدم هو المفتاح لكيان المستخدم.