我正在通过 App NDB 编写 REST api
我排除了现有的库,因为我需要控制事务和缓存。
我出于类似的原因排除了它,还因为我不想使用他们提供的客户端。
在评估架构决策时,我遇到了问题和奇怪的情况,这是因为我可能在风格方面没有足够的经验。
目前,我正在尝试提出一些指导方针来塑造我的代码库:
我遇到的一件特别的事情是
我使用映射模型实现了多对多关系,例如
,与用户和
的关键
现在,在我的服务中,有时我想返回一个包含当前用户所属组织列表的对象,并递归获取每个组织中的公司:
'':[
'名称':'测试'
'': [ {}, {}]
},
…
我这样做
定义(用户):
定义 (x):
= .(x) #这个
X
= [ .get() for in .(用户)]
[(x) 中的 x ]
在突出显示的行中,我将动态属性 \'\' 附加到组织模型
现在,如果我在处理程序中调用此方法,当我创建字典表示形式以输出 json 时,ndb.Model.() 实现会忽略动态附加的属性。
我尝试过的一种解决方案是(在我的处理程序中)
xs = .(u)
= [x.() for x in xs]
对于 (0,len(xs)) 中的 x:
[x][''] = xs[x].()
但我不喜欢它,因为我需要知道每个组织都有一个 \'\' 属性,而且代码看起来有点复杂并且不明显
另一种方法是覆盖 ndb.Model.()
隔离动态附加属性并提供字典表示简化了处理程序中的代码,让我只需对服务返回的内容进行 call() 即可。
从 ..ext 导入 ndb
导入实用程序
10
11
12
13
14
类(ndb.模型):
=ndb。(=正确)
=ndb。(=正确)
# 应用程序时钟时间是
# 时间 (UTC).s
def(自身,=无,=无):
= 超级(, 自我).(=, =)
['key'] = self.key.id() #获取密钥
# add 添加到类中
= {k:v for (k,v) in vars(self).() if not k.('_')}
对于 prop,.() 中的 val:
[prop] = val.() if not (val, list) else [x.() for x in val]
util.()
您对这种方法有什么建议吗? 任何想法将不胜感激!
ndb 通过类型支持动态属性。
而不是将模型定义为:
类(ndb.模型):
使用:
定义它
类(ndb.):
现在,如果你写 =[…],call() 将输出这些公司。 当您 put() 这些实体时要小心,因为任何动态添加的属性也将被放入数据存储中。
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。