Я пытаюсь запросить некоторые данные, используя gcloud
API, который я только что обнаружил. Я хотел бы запросить KeyPropery
. например.:
from google.appengine.ext import ndb
class User(ndb.Model):
email = ndb.StringProperty()
class Data(ndb.Model):
user = ndb.KeyProperty('User')
data = ndb.JsonProperty()
В GAE я могу довольно легко запросить это, если у меня есть ключ пользователя:
user = User.query(User.email == '[email protected]').get()
data_records = Data.query(Data.user == user.key).fetch()
Я хотел бы сделать что-то подобное, используя gcloud
:
from gcloud import datastore
client = datastore.Client(project='my-project-id')
user_qry = client.query(kind='User')
user_qry.add_filter('email', '=', '[email protected]')
users = list(user_qry.fetch())
user = users[0]
data_qry = client.query(kind='Data')
data_qry.add_filter('user', '=', user.key) # This doesn't work ...
results = list(data_qry.fetch()) # results = []
Глядя на документацию для add_filter
, не видно, что Entity.key
является поддерживаемый тип:
value (int, str, bool, float, NoneType, :class
datetime.datetime
) — значение для фильтрации.
Можно ли добавить фильтры для ключевых свойств?
Я провел еще немного поисков, чтобы попытаться выяснить, что здесь происходит на самом деле. Я не уверен, что это полезно для меня, чтобы понять эту проблему в настоящее время, но, возможно, это будет полезно для кого-то еще.
Я смоделировал базовые вызовы в соответствующих библиотеках для записи буферов протокола, которые сериализуются и отправляются на сервер. Для GAE это Batch.create_async
в datastore_query.
Для gcloud
это datastore.Client.connection.run_query
. метод. Глядя на получившиеся буферы протокола (анонимизированные), я вижу:
gcloud запрос pb.
kind {
name: "Data"
}
filter {
composite_filter {
operator: AND
filter {
property_filter {
property {
name: "user"
}
operator: EQUAL
value {
key_value {
partition_id {
dataset_id: "s~app-id"
}
path_element {
kind: "User"
name: "user_string_id"
}
}
}
}
}
}
}
GAE-запрос pb.
kind: "Data"
Filter {
op: 5
property <
name: "User"
value <
ReferenceValue {
app: "s~app-id"
PathElement {
type: "User"
name: "user_string_id"
}
}
>
multiple: false
>
}
Насколько я могу судить, две библиотеки используют разные версии прототипа, но передаваемые данные выглядят очень похожими...
X
по ключу объектаX
. Я спрашиваю, как мне запросить таблицуX
по свойству, в котором хранится ключ из объекта видаY
. - person mgilson   schedule 17.03.2016