سؤال

رسالة الفصل (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 ()). قيمة الممتلكات إشارة المستخدم هو المفتاح لكيان المستخدم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top