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'}]
 }
]

編集

連絡先のコレクションを取得する必要がありましたが、問題は1つだけでした。これは、Contactがエンコードされているときに、Traderオブジェクトとこれが連絡先などを再帰的にエンコードしようとしたことです。

したがって、明らかなエラー再帰エラーが発生しました。これに対する解決策は、エンコード時に連絡先からトレーダーオブジェクトを削除することでした。

4

3 に答える 3

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 に答える
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 に答える
0

人を含むすべての連絡先を検索する場合は、その人のクエリを発行する必要があります。

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