如何获得NDB数据存储的复合ID

时间:2016-11-02 02:56:29

标签: python google-app-engine

以前,我有以下实体

someClass.SendFile(file, new ActivityCallbacks.ActivityCallback((r) =>
{
      success =>
      {
           try
           {
                 var newmessage = new ChatroomChatMessages(r.GetString("id"), r.GetString("original_file"), Utils.convertTimestampToDate(Java.Lang.JavaSystem.CurrentTimeMillis()), "Me :", true, "16", Constants.MyId,  chatroomId);
                 addMessage(newmessage);
           }
           catch (Exception e)
           {
                  //e.printStackTrace();
           }
      },fail => System.Console.WriteLine("failed to send")
 }));

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

name

通过user = User.get_or_insert(name, name=name, timestamp=datetime.datetime.fromtimestamp(user_timestamp)) 作为ID,我可以使用name执行快速阅读或更新。

现在,我决定将我的实体更改为以下内容,同时将namename作为复合ID。

type

在提及https://stackoverflow.com/a/5454623/72437

之后

我的第一个想法是,通过连接class User(ndb.Model): name = ndb.StringProperty(required = True) type = ndb.StringProperty(required = True) timestamp = ndb.DateTimeProperty(required = True) name,它实现了我的复合id目的。

type
很快,我意识到这个想法是个缺陷。由于以下情况会造成冲突。

user = User.get_or_insert(name+type, name=name, type=type
    timestamp=datetime.datetime.fromtimestamp(user_timestamp))

2个不同的用户最终会使用相同的ID。

我想知道,对我来说什么是正确的方式

  1. 要根据name type id ------------------------- cheok paid cheokpaid cheokp aid cheokpaid name
  2. 获得合成ID
  3. 使用typename
  4. 快速阅读或更新

1 个答案:

答案 0 :(得分:4)

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

例如,如果您使用'_'作为分隔符,那么

cheok   paid  become cheok_paid   and
cheokp  aid   become cheokp_aid