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

1 投票
1 回答
554 浏览
提问于 2025-04-16 07:46

我想要有两种实体相互引用。但是在第一个实体的代码里,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)

如果你建议只在一个实体中使用引用,然后在另一个实体中使用隐式创建的属性(这其实是一个查询对象)。那么我就想问,使用查询和直接用 get() 方法获取键值,哪个对 CPU 的消耗更大?

请告诉我怎么在 Python 中写这段代码。

1 个回答

4

查询的速度稍微慢一些,所以它们会消耗更多的资源。ReferenceProperty 并不要求指定 reference_class。因此,你可以这样定义 Business:

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

你的数据结构可能还有更好的选择。可以看看这篇关于 建模关系 的文章,里面有一些想法。

这是一个一对一的映射吗?如果是的话,可能你更适合对数据进行去规范化处理。

数据会发生变化吗?如果不会(而且是一个一对一的关系),也许你可以使用实体组,并将数据结构设计得更简单,这样你就可以直接使用键或键名。你可以通过将 BusinessInfo 设为 Business 的子项来实现,然后始终使用 'i' 作为键名。例如:

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())

撰写回答