为App Engine NDB模型指定key_name的最佳方法是什么?

时间:2012-04-18 18:31:18

标签: google-app-engine app-engine-ndb

我正在尝试创建一个ndb模型,其中每个记录都有一个唯一的字段“name”。我想将此字段定义为key_name字段,并使用它来查找记录。我是否必须包含名称字段,或者我可以以某种方式将key_name字段设置为用户可以指定的任意字符串,只要它是唯一的吗?

我正在考虑使用Model.get_or_insert来确保旧记录不会被覆盖,但有没有办法判断返回值是新创建还是预先存在?如果用户输入了重复的名称,我希望能够显示错误消息。

最后,我尝试在DjangoForms模型上创建一个key_name字段,该模型使用上面的ndb模型作为元类,因此我可以使用djangoforms进行验证/渲染,但由于某些原因,我的定义字段不会显示。

类UserProfileForm(djangoforms.ModelForm):     key_name = djangoforms.StringProperty()     类Meta:         model = UserProfile

1 个答案:

答案 0 :(得分:14)

  

我是否必须包含名称字段,或者我可以以某种方式将key_name字段设置为用户可以指定的任意字符串,只要它是唯一的吗?

您可以将您的唯一键名作为id参数传递给模型构造函数:profile = UserProfile(id='my_unique_name')

  

我正在考虑使用Model.get_or_insert来确保旧记录不会被覆盖,但有没有办法判断返回值是新创建还是预先存在?如果用户输入了重复的名称,我希望能够显示错误消息。

使用Model.get_by_id()。如果找不到模型,它将返回模型实例或None

profile = UserProfile.get_by_id('my_unique_name')
if profile:
    # display error message saying that the user already exists.
  

最后,我尝试在DjangoForms模型上创建一个key_name字段,该模型使用上面的ndb模型作为元类,因此我可以使用djangoforms进行验证/渲染,但由于某些原因,我的定义字段不会显示。

我不知道DjangoForms是如何工作的,但很可能它们与NDB不兼容。您将需要创建自己的验证逻辑。