.put()之前的reference属性的GAE数据存储区密钥用法

时间:2014-12-02 03:57:41

标签: python google-app-engine google-cloud-datastore

这似乎是一个简单的问题,但是想要比我目前所做的更清楚:

给出这样的表格(仅限示例):

class People(db.Model):
    FirstName  = db.StringProperty(multiline=False,required=True)
    LastName   = db.StringProperty(multiline=False,required=True)
class Animals(db.Model):
    AnimalName = db.StringProperty(multiline=False,required=True)
class SpiritAnimal(db.Model):
    Person     = db.ReferenceProperty(Candidates,required=True)
    Animal     = db.ReferenceProperty(Candidates,required=True)

有一种方法可以填写“人物”。和动物'使用查询到其他两个表,如下所示(仅限示例):

# Query for some person(s)
query = People.all()
query.filter('FirstName', 'Patrick')
query.get()
for person in query:
    newSpiritAnimal = SpiritAnimal(
        Person     = person,
        Animal     = animal # Assuming pulled previously
    )
    newSpiritAnimal.put()

你也可以抓住钥匙,但这里是我的问题所在:

基于如上所述的查询,您可以拉出密钥并稍后使用吗?当然可以,但是最好的方法是什么?

让我们考虑一下这个例子:

for person in query:
    key_for_later_use = person.key()

现在我们可以使用:

Person = key_for_later_use

人们会认为正确吗?除了这个person.key()对象似乎没有做这个伎俩所以我更多地研究了它:

str(person.key())

这提供了一个类似于在查看“数据存储查看器”时在GAE SDK控制台中看到的内容的键。因此可能有用,但也没有运气。

什么是从查询中获取密钥的最佳方法,可能是在通过for循环进行迭代时?

我一直在尝试通过创建一个列表来卸载数据存储区查询,我检查现有的内容,然后从另一个列表中获取密钥:

people_list = [] # Assume populated with 'FirstName'
people_list_keys = [] # Assume populated with person.key()
if 'Patrick' in people_list:
    patrick_key = people_list_keys[people.index('Patrick')]

然而,person.key()并没有真正起作用,str()围绕着看起来正确但不起作用..而且我的意思是将它作为SpiritAnimal.Person用于ReferenceProperty的插入

思想?

哦,我真的没有制作一个SpiritAnimal应用程序,这只是一个例子;)

1 个答案:

答案 0 :(得分:1)

其他地方可能存在脱节,我运行了此代码:

    People(FirstName="Patrick", LastName="Doe").put()

    animal = Animals(AnimalName="Tiger").put()
    people_list = [] 
    people_list_keys = []

    query = People.all()
    query.filter('FirstName', 'Patrick')
    query.get()

    for person in query:
        people_list.append(person.FirstName)
        people_list_keys.append(person.key())

    patrick_key = people_list_keys[people_list.index('Patrick')]

    newSpiritAnimal = SpiritAnimal(
    Person     = patrick_key,
    Animal     = animal
    )
    newSpiritAnimal.put()

并且精神动物被放置了'没问题。我不太了解你想做什么。也许更多的解释,我可以帮助更多。