我认为这是微不足道的,但对Python来说还是新手。
我正在尝试使用谷歌应用引擎创建一个模型。
基本上从E / R的角度来看 我有2个带有连接表的对象(连接表捕获连接的时间点) 像这样的东西
Person | Idea | Person_Idea
-------------------------------
person.key idea.key person.key
idea.key
date_of_idea
我的Python代码看起来像
class Person (db.Model):
#some properties here....
class Idea(db.Model):
#some properties here....
class IdeaCreated(db.Model):
person= db.ReferenceProperty(Person)
idea= db.ReferenceProperty(Idea)
created = db.DateTimeProperty(auto_now_add = True)
我想要做的是有一种方便的方式来获得一个人的所有想法(绕过想法创建的对象) - 有时我会直接需要想法列表。
我能想到的唯一方法就是在User类
上添加follow方法def allIdeas(self):
ideas = []
for ideacreated in self.ideacreated_set:
ideas.append(ideacreated.idea)
return ideas
这是唯一的方法吗?我有一个更好的方式,我失踪了吗?
另外假设我可以使用GQL并绕过保护ideaCreated实例(不确定确切的语法),但是对我来说GQL查询有点不对。
答案 0 :(得分:4)
你应该将这个人作为这个想法的祖先/父母。
idea = Idea(parent=some_person, other_field=field_value).put()
然后你可以查询some_person是祖先的所有想法
persons_ideas = Idea.all().ancestor(some_person_key).fetch(1000)
祖先密钥将包含在Idea
实体密钥中,一旦创建实体,您将无法更改祖先。
我强烈建议您使用ndb
代替db
https://developers.google.com/appengine/docs/python/ndb/
ndb
您甚至可以使用StructuredProperty
或LocalStructuredProperty
https://developers.google.com/appengine/docs/python/ndb/properties#structured
修改强>
如果您需要多对多的关系,请查看ListProperties并将Persons键存储在该属性中。然后,您可以在该属性中查询具有该密钥的所有创意。
class Idea(db.Model):
person = db.StringListProperty()
idea = Idea(person = [str(person.key())], ....).put()
在想法中加入另一个人
idea.person.append(str(another_person.key())).put()
ideas = Idea.filter(person=str(person.key())).fetch(1000)
查看https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses#ListProperty