当从传统的关系数据库转移到非关系数据库(如)时,如何正确地进行数据建模一直是个问题。
我已经读了很多次NDB的官方文件,并尝试了几个教程在互联网上,然而,我仍然被塞。
我正在开发一个财务应用程序,其中包含了我所有的个人支出。这意味着我设计了一个名为费用的实体,上面有一些属性。作为费用的一部分,我还设计了一个供应商实体来存储与商家相关的信息。
以下是实现:
class Expense(ndb.Model):
amount = ndb.FloatProperty(required=False)
description = ndb.StringProperty()
vendor = ndb.KeyProperty(kind=Vendor)
class Vendor(ndb.Model):
companyName = ndb.StringProperty(required=False)
friendlyName = ndb.StringProperty(required=False, default="")这是检索费用信息的代码:
def get(self):
template_page = "expense.html"
template_values = {'expense':Expense.query()}
self.renderTemplatePage(template_page, template_values)我在上面的设计中所面临的问题是如何收回费用和供应商信息,并将其传递给JINJA进行渲染。正如我所预期的那样,费用类中的Vendor属性只是一个键,而不是对象本身。因此JINJA无法理解{{expense.vendor.friendlyName}表达式。
虽然问题似乎是技术性的,但我相信我的差异与非关系数据库的概念和我应用于解决方案的类似传统的设计有关。
另一种选择是使用StructuredProperty而不是KeyPrperty。然而,一个解决方案要求是能够重命名一个供应商友好的名称,这应该会影响到所有的退出费用。去寻找每一个被构造的属性并发现这些变化是很疯狂的。
在放弃advice和转到之前,我想听听一些关于如何解决这个数据建模场景的建议。也许我需要构建的解决方案不推荐用于非关系数据库。
对此的任何支持。
发布于 2015-07-19 20:05:48
在模板中可以这样做:
{{ expense.vendor.get().friendlyName }}也可以将属性添加到模型中:
class Expense(ndb.Model):
amount = ndb.FloatProperty(required=False)
description = ndb.StringProperty()
vendor = ndb.KeyProperty(kind=Vendor)
@property
def vendor_name(self):
return self.vendor.get().friendlyName这将允许在模板中:
{{ expense.vendor_name }}为了避免这种效率低下,您可以在显示费用列表之前获取供应商,在循环中调用get只是本地内存查找:
def get(self):
template_page = "expense.html"
expenses = Expense.query().fetch()
ndb.get_multi([e.vendor for e in expenses])
template_values = {'expense':expenses}
self.renderTemplatePage(template_page, template_values)https://stackoverflow.com/questions/31504541
复制相似问题