1

これは些細なことですが、Pythonにとってはかなり新しいと思います。

GoogleAppEngineを使用してモデルを作成しようとしています。

基本的に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クエリを配置するのは私には悪臭がします。

4

1 に答える 1

4

あなたはその人をそのアイデアの祖先/親として使うべきです。

idea = Idea(parent=some_person, other_field=field_value).put()

次に、some_personが祖先であるすべてのアイデアをクエリできます

persons_ideas = Idea.all().ancestor(some_person_key).fetch(1000)

祖先キーはIdeaエンティティキーに含まれ、エンティティが作成されるとその祖先を変更することはできません。

https://developers.google.com/appengine/docs/python/ndb/ndbの代わりに使用することを強くお勧めしますdb

またはhttps://developers.google.com/appengine/docs/python/ndb/properties#structuredを使用するndbこともできますStructuredPropertyLocalStructuredProperty

編集:
多対多の関係が必要な場合は、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を調べてください

于 2012-12-13T14:21:01.597 に答える