您好我试图将DataStore背后的概念作为No-SQL数据库,我试图获取的是一个被另一个“引用”的对象列表。就这个
class Person(db.Model):
name = db.StringProperty(required=True)
class Contact(db.Model):
name = db.StringProperty(required=True)
email = db.StringProperty()
trader = db.ReferenceProperty(Person)
这很好用,当我使用person.put()时没有任何问题就可以保存它们。但是当我尝试检索它并编码为json时,它会向我显示联系人作为列表实际上它完全忽略了它。
persons_query = Person.all()
persons = persons_query.fetch(50)
data = json.encode(persons)
我希望人们有一个联系人的集合,但它对如何解决这个问题没有任何想法?
为了使目前更清楚,我得到这样的东西:
[
{
name: "John Doe"
}
]
我想成为
[
{
name: "John Doe"
contacts: [{name:"Alex", email:'alex@gmail.com'}]
}
]
修改
感谢所有你正确的我需要获取联系人的集合只有一个问题是,当正在编码Contact时,它递归地尝试编码Trader对象,这是它的联系等等。
所以我得到了一个明显的错误递归错误,解决方法显然是在编码时从联系人中删除交易者对象。
答案 0 :(得分:1)
要获取所有联系人,您需要编写一个自定义json编码器,该编码器将获取引用属性的所有反转。
ReferenceProperties自动获得反向查询。从文档“collection_name是要提供给引用的模型类的属性的名称。该属性的值是对引用该实体的所有实体的查询。如果未设置collection_name,则modelname_set(具有引用的名称)使用小写字母和_set添加的模型。“
因此,您将添加一个方法来解析反向引用集查询。
class Person(db.Model):
name = db.StringProperty(required=True)
def contacts(self):
return self.contact_set.fetch(50) # should be smarter than that
然后在自定义json编码器中使用它。
答案 1 :(得分:1)
在班级中制作自定义toJson函数
class Person(db.Model):
name = db.StringProperty(required=True)
def toJson(self):
contact = self.contact_set #this is the default collection name for your class
d = {"name":self.name,"contact":contact}
return json.dumps(d)
class Contact(db.Model):
name = db.StringProperty(required=True)
email = db.StringProperty()
trader = db.ReferenceProperty(Person)
然后你可以做ff:
persons_query = Person.all()
persons = persons_query.fetch(50)
data = person.toJson()
答案 2 :(得分:0)
如果您想查找包含某人的所有联系人,则需要为其发出查询。
contacts = Contact.all().filter("trader =", person)