Python 如何拥有NDB数据存储的复合ID

Python 如何拥有NDB数据存储的复合ID,python,google-app-engine,Python,Google App Engine,在此之前,我拥有以下实体 class User(ndb.Model): name = ndb.StringProperty(required = True) timestamp = ndb.DateTimeProperty(required = True) 我使用name作为id,通过以下方式编写代码 user = User.get_or_insert(name, name=name, timestamp=datetime.datetime.fromtimestamp

在此之前,我拥有以下实体

class User(ndb.Model):
    name = ndb.StringProperty(required = True)
    timestamp = ndb.DateTimeProperty(required = True)
我使用
name
作为id,通过以下方式编写代码

user = User.get_or_insert(name, name=name, 
    timestamp=datetime.datetime.fromtimestamp(user_timestamp))
通过将
名称
作为id,我可以使用
名称
执行快速读取或更新


现在,我决定将我的实体更改为以下内容,并将
name
type
作为复合id

class User(ndb.Model):
    name = ndb.StringProperty(required = True)
    type = ndb.StringProperty(required = True)
    timestamp = ndb.DateTimeProperty(required = True)
转介后

我的第一个想法是,通过连接
名称
类型
,它实现了我的复合id目的

user = User.get_or_insert(name+type, name=name, type=type
    timestamp=datetime.datetime.fromtimestamp(user_timestamp))
很快,我意识到这个想法是有缺陷的。由于以下情况会产生冲突

name    type    id 
-------------------------   
cheok   paid    cheokpaid
cheokp  aid     cheokpaid
2个不同的用户最终拥有相同的id

我想知道,什么是适合我的方法

  • 基于
    名称
    类型
  • 使用
    名称
    类型

  • 为什么不在连接名称和类型时使用分隔符呢。然后,您的代码将按原样工作并解决您的问题

    例如,如果使用“u”作为分隔符

    cheok   paid  become cheok_paid   and
    cheokp  aid   become cheokp_aid  
    

    为什么不在连接名称和类型时使用分隔符呢。然后,您的代码将按原样工作并解决您的问题

    例如,如果使用“u”作为分隔符

    cheok   paid  become cheok_paid   and
    cheokp  aid   become cheokp_aid  
    

    {name中的字符数}{name+“{type
    怎么样。您还可以在末尾连接。通过在“{}”处拆分,您可以得到名称末尾的索引。@GAEfan只是好奇,“名称中的字符数”与
    id=“{}{}{}}{{}”。format(len(name),name,type)
    ?OP提到了用户在
    name
    中有尾随下划线或
    type
    中有前导下划线的问题,因此,使下划线分隔符不可用(无法区分
    “name”+“+”type”
    “name”+“+”type”
    。num\u字符让OP知道
    name
    type
    之间的分隔符在哪里。为了可读性,我仍然添加了下划线分隔符。(我知道OP现在已经删除了这个反对意见。)那么
    {name}+name+“{”+type
    呢。你也可以在末尾连接。通过在“}”处拆分,你可以得到名称末尾的索引。@GAEfan只是好奇,用
    id=“{}{}}}}格式(len(name),name,type)“name中的字符数”有什么意义
    ?OP提到用户在
    名称中有尾随下划线,或在
    类型中有前导下划线,从而使下划线分隔符不可用(无法区分
    “名称”+“类型”
    “名称”+“+”类型)
    。num_字符让OP知道
    名称
    类型
    之间的分隔位置。为了可读性,我仍然添加了下划线分隔符。(我发现OP现在已经删除了该异议。)