带有参考集的Google App Engine返回对象

时间:2012-08-25 20:29:30

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

您好我试图将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对象,这是它的联系等等。

所以我得到了一个明显的错误递归错误,解决方法显然是在编码时从联系人中删除交易者对象。

3 个答案:

答案 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)