使用Google App Engine从db.ReferenceProperty切换到ndb?

Pap*_*ter 3 python google-app-engine

今天我在这里阅读这篇文章,介绍如何在我的GAE REST API中使用One To Many关系.

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

我认为这非常简单,但后来我意识到我使用的是ndb而不是db,所以我不能使用db.ReferenceProperty.

在这里,我有一个模型路线

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()
Run Code Online (Sandbox Code Playgroud)

在这里,我有我的模型RegularDays,如果收到的JSON中的Regular为True,将使用它

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)
Run Code Online (Sandbox Code Playgroud)

所以我要做的就是这个.

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()
Run Code Online (Sandbox Code Playgroud)

但现在我对如何更改此代码非常困惑,因此它适用于NDB.

谢谢你的帮忙

Jai*_*mez 6

在等效ndbKeyProperty:

数据存储区密钥

可选关键字参数:kind = kind,要求分配给此属性的键始终具有指定的类型.可以是字符串或Model子类.

你会发现在你的例子中简单地替换属性名就足够了,除了关键字collection_name不再起作用了:那是因为旧ReferenceProperty的在幕后为你做了一些工作,在引用的类中创建一个查询属性来试试让你的生活变得更轻松,但它被放弃了ndb,选择更明确的方法来存储密钥并让你担心实现细节.

如果您想知道,这种变化的原因是自动属性非常容易使用,通常忽略实际发生的事情(看不见,心不在焉),并最终导致很多额外的工作和查询耗费时间进行优化.

这对你意味着什么,而不是写这一行:

for phone in scott.phone_numbers:
Run Code Online (Sandbox Code Playgroud)

你必须phone_numbers自己编写代码:)