0

我正在绕圈子获取 NDB 数据存储区的 id

我已经设置了webapp2.RequestHandler捕获电子邮件并获取 ID。基本上我的目标是删除一个实体,但是如果我通过电子邮件地址来获取实体的 ID,我就很难过,因为它给了我刚刚得到的结果。我使用 ID 而不是key_name.

我尝试通过电子邮件查询来查找 ID,但似乎使用 query 没有方法属性来查找 id。

def get(self,email):
  user = users.get_current_user()
  if user:
    user_key = ndb.Key('UserPrefs',user.email())
    contacts = Contact.query(Contact.email==email,ancestor=user_key)
    self.response.write(contacts.id) # there is no attribute such as Contact.id

我试图通过获取密钥来查找 ID,但是当我显示密钥时,它显示了我在email变量中拥有的任何值

def get(self,email):
  user = users.get_current_user()
  if user:
    user_key = ndb.Key('UserPrefs',user.email())
    contact_key = ndb.Key('Contact',email,parent=user_key)
    self.response.write(contact_key.id())

真正的问题:那么,鉴于我没有 ID ,如果我通过 id 而不是 key_name 保存我的实体,如何在实体中找到正确的 ID ?

这是我正在尝试的混合代码。

def get(self,email):
  user = users.get_current_user()
  if user:
    user_key = ndb.Key('UserPrefs',user.email())
    contact_key = ndb.Key('Contact',email,parent=user_key)
    contacts = Contact.query(Contact.email==email,ancestor=user_key)
    contact = contacts.get()
    contact_key.delete()
    # self.response.write(contact.name) # this works
    self.response.write(contact_key.id()) # this does not work because I do not have the entity id, and I'd like to get it blindfolded. Is there a way?

这是我的联系模型。

class Contact(ndb.Model):
  name = ndb.StringProperty()
  phone = ndb.StringProperty()
  email = ndb.StringProperty()
  dateCreated = ndb.DateTimeProperty(auto_now_add=True)
  dateUpdated = ndb.DateTimeProperty(auto_now=True)
4

2 回答 2

2

文档状态:

The identifier may be either a key "name" string assigned by the application or an integer numeric ID generated automatically by the Datastore.

由于您在类上定义name属性Contact,因此将其用作标识符。(你不希望这样,因为在现实世界中不同的用户可以有相同的名字)

因此,如果您希望 NDB 为您的实体生成数字 ID,请将name属性重命名为其他名称,例如username.

更新:让我们一步一步来:

第一个示例的问题是您正在尝试id使用Query。查询类没有id定义任何属性。你应该调用get()它:

# get() or fetch() should be called on query to return some data
contacts = Contact.query(Contact.email==email,ancestor=user_key).get()
self.response.write(contacts.id) # there is no attribute such as Contact.id

第二段代码的问题在于您只是在初始化一个 Key并将电子邮件作为id- 构造函数的第二个参数是 theid并且您将电子邮件作为值提供。因此,您将收到电子邮件。此外,这里没有数据库操作。

于 2013-10-06T07:16:18.680 回答
-1

注意:标识符,即idkeyurlsafevalue(用于查询)应通过 webapp2.RequestHandler 从解析的 url 或 HTTP POST、GET、PUT 或 DELETE 从 HTTP 请求传递。

如果您没有从 HTTP 请求传递的任何标识符,则可能难以访问特定实体(或记录)。因此,重要的是要注意传递某种形式的标识符或值来访问特定实体(或数据库术语中的记录)。

因此,您可以执行以下操作来获取 id:

按值访问:

def get(self,email):
  user = users.get_current_user()
  if user:
    user_key = ndb.Key('UserPrefs',user.email())
    contacts = Contact.query(Contact.email==email,ancestor=user_key)
    contact = contacts.get()
    id = contact.key.id() # this access the entity id directly because you have the data.
    self.response.write(id)

通过 urlsafe 访问:

def get(self,urlString):
  user = users.get_current_user()
  if user:
    contact_key = ndb.Key(urlsafe=urlString) #urlString refers to the key of contact
    contact = contact_key.get()
    id = contact.key.id() # this access the entity id directly because you have the data.
    self.response.write(id)

通过 HTTP POST 请求访问:

def post(self):
  user = users.get_current_user()
  if user:
    user_key = ndb.Key('UserPrefs',user.email())
    email = self.request.get('email')
    contacts = Contact.query(Contact.email==email,ancestor=user_key)
    contact = contacts.get()
    id = contact.key.id() # this access the entity id directly because you have the data.
    self.response.write(id)
于 2013-10-07T00:43:09.880 回答