2015-03-29 2 views
3

Сегодня я прочитал эту статью здесь о том, как сделать отношения «Один ко многим», которые я использую в своем API GAE REST.Переключение с db.ReferenceProperty на ndb с помощью Google App Engine?

https://cloud.google.com/appengine/articles/modeling

Я думал, что это было довольно просто, но потом я понял, что я использую ОПРС и не дБ, так что я не могу использовать db.ReferenceProperty.

Здесь я есть модель Route

class Route(ndb.Model): 

    driver_id = ndb.IntegerProperty() 
    requester_id = ndb.IntegerProperty() 
    startpoint = ndb.GeoPtProperty(required=True) 
    endpoint = ndb.GeoPtProperty(required=True) 
    regular = ndb.BooleanProperty(required=True) 
    date_and_time = ndb.DateTimeProperty(required=True) 
    places_available = ndb.IntegerProperty() 
    val_lift = ndb.IntegerProperty() 

А вот у меня есть модели RegularDays, которые будут использоваться, если Regular в JSON получили Правда

class RegularDays(ndb.Model): 

    route = db.ReferenceProperty(Route, 
            collection_name='regular_days') 
    Monday = ndb.BooleanProperty(required=True) 
    Tuesday = ndb.BooleanProperty(required=True) 
    Wednesday = ndb.BooleanProperty(required=True) 
    Thursday = ndb.BooleanProperty(required=True) 
    Friday = ndb.BooleanProperty(required=True) 
    Saturday = ndb.BooleanProperty(required=True) 
    Sunday = ndb.BooleanProperty(required=True) 

Так что я хотел бы сделать это просто это.

if newroute.regular: 
       RegularDays(route=newroute, 
        Monday=route_json['Days']['Monday'], 
        Tuesday=route_json['Days']['Tuesday'], 
        Wednesday=['Days']['Wednesday'], 
        Thursday=route_json['Days']['Thursday'], 
        Friday=route_json['Days']['Friday'], 
        Saturday=route_json['Days']['Saturday'], 
        Sunday=route_json['Days']['Sunday']).put() 

Но теперь я очень смущен тем, как изменить этот код, чтобы он работал с NDB.

Благодарим Вас за помощь

ответ

6

эквивалент в ndb является KeyProperty:

Datastore ключ

Дополнительное ключевое слово аргумент: вид = вид, требовать ключи, присвоенные этому свойству всегда указанный вид. Может быть строкой или подклассом модели.

Вы обнаружите, что просто заменить имя свойства будет достаточно в ваших примерах, за исключением ключевого слова collection_name больше не будет работать: это потому, что старый ReferenceProperty сделал некоторую работу для вас за кадром, создавая query в ссылочном классе, чтобы попытаться сделать вашу жизнь проще, но она была сброшена в ndb, выбрав более явный подход просто хранить ключи и позволять вам беспокоиться о деталях реализации.

В случае, если вам интересно, причина этого изменения заключается в том, что автоматические свойства были настолько просты в использовании, что было обычным игнорировать то, что действительно происходило (с глаз долой, из сердца вон) и в конечном итоге с большим количеством дополнительной работы и запросов, которые потребовали много времени для оптимизации.

Что это означает для вас является то, что вместо того, чтобы писать эту строку:

for phone in scott.phone_numbers: 

Вы должны кодировать phone_numbers запрос сами :)

+0

Спасибо за ответ, это гораздо яснее , –

Смежные вопросы