0

嗨,我有点试图将 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'}]
 }
]

编辑

谢谢你是对的,我需要获取联系人集合,只有一个问题是,当联系人被编码时,它递归地尝试对 Trader 对象进行编码,这是联系人等等。

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

4

3 回答 3

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()
于 2012-08-26T02:57:42.107 回答
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 编码器中使用它。

于 2012-08-26T00:28:20.617 回答
0

如果您想查找包含某个人的所有联系人,您需要为其发出查询。

contacts = Contact.all().filter("trader =", person)
于 2012-08-25T20:59:56.313 回答