google-app-engine: как применить фильтр в запросе, если параметром фильтра является db.ReferenceProperty? - PullRequest
0 голосов
/ 14 декабря 2011

Это следующий шаг к этому вопросу, где мне нужно выполнить запросы и применить фильтры. Вот моя модель

from google.appengine.ext import db
Class Car(db.Model):
    name=db.StringProperty()
    model=db.StringProperty()
    mileage=db.IntegerProperty()
    person = db.ReferenceProperty(Person, collection_name='person')

Class Person(db.Model):
    name=db.StringProperty()
    age=db.IntegerProperty()

Вопрос : Для человека я хочу получить все машины, которыми он владеет

Подход : Получить все машины и применить фильтр к человеку, которого зовут "Случайный" Я попробовал следующее, но это не работает

s = Car.all()
s.filter('person.name =', 'Random') # It fails here
result = s.fetch(1)[0] # just first result for now
print result.text
print result.votes
print result.page.language

Как мне выполнить этот запрос?
Спасибо

1 Ответ

2 голосов
/ 14 декабря 2011

Вы можете использовать фильтр только для индексированных атрибутов. person.name от другого лица! В sql вам нужно будет использовать join (что невозможно, когда объем данных увеличивается), в google bigtable, как и во многих других таблицах нереляционных баз данных, join невозможно. К счастью, ваш случай очень прост, вы можете выбрать все автомобили, если вы знаете людей ключ:

>>> person = Person.all().filter('name =', 'Mr. Random').fetch(1)[0]
>>> cars = Car.all().filter('person =', person.key())

Если вы использовали более разумное значение для collection_name

Class Car(db.Model):
    ...    
    person = db.ReferenceProperty(Person, collection_name='cars_collection')

Вы можете получить доступ ко всем машинам, как это:

>>> person = Person.all().filter('name =', 'Mr. Random').fetch(1)[0]
>>> mrs_randoms_cars = person.cars_collection
...