App Engine,两个实体之间的交叉引用

时间:2010-11-29 17:55:25

标签: python google-app-engine google-cloud-datastore

我希望有两种类型的实体相互引用。 但python不知道第一个体中第二个实体类的名称。 那我该怎么编码。

class Business(db.Model):
  bus_contact_info_ = db.ReferenceProperty(reference_class=Business_Info)

class Business_Info (db.Model):
  my_business_ =  db.ReferenceProperty(reference_class=Business)

如果您建议仅使用一个引用并使用隐式创建的属性 (在其他方面是一个查询对象)。 然后我质疑使用查询vs直接使用密钥

上的get()的CPU配额惩罚

请告知如何在python中编写此代码

1 个答案:

答案 0 :(得分:4)

查询速度稍慢,因此他们会使用更多资源。 ReferenceProperty要求 reference_class。因此,您可以随时定义业务:

class Business(db.Model):
  bus_contact_info_ = db.ReferenceProperty()

您的数据结构也可能有更好的选择。查看modelling relationships文章了解一些想法。

这是一对一的映射吗?如果这是一对一映射,那么最好不要对数据进行非规范化。

它有变化吗?如果不是(并且它是一对一的),也许您可​​以使用实体组并构建数据,以便您可以直接使用键/键名称。您可以通过使BusinessInfo成为Business的子项来执行此操作,然后始终使用“i”作为key_name。例如:

business = Business().put()
business_info = BusinessInfo(key_name='i', parent=business).put()

# Get business_info from business:
business_info = db.get(db.Key.from_path('BusinessInfo', 'i', parent=business))

# Get business from business_info:
business = db.get(business_info.parent())