Google App Engine ReferencePropertyの関係
-
06-07-2019 - |
質問
ReferencePropertyを使用して関連するモデルを取得しようとしていますが、あまり運がありません。グループ、トピック、長所、短所の3つのレベルがあります。グループには多くのトピックがあり、各トピックには多くの長所と短所があります。
新しいグループをうまく保存できますが、これらのグループの下にトピックを保存する方法がわかりません。リンクのあるページからリンクする" New topic"各グループの下に、単純なフォーム(今のところ1つのフィールド)に移動します。当然のことながら、URLにはグループのIDなどに対する何らかの参照が必要です。
ここに私のモデルがあります:
class Groups(db.Model):
group_user = db.UserProperty()
group_name = db.StringProperty(multiline=True)
group_date = db.DateTimeProperty(auto_now_add=True)
class Topics(db.Model):
topic_user = db.UserProperty()
topic_name = db.StringProperty(multiline=True)
topic_date = db.DateTimeProperty(auto_now_add=True)
topic_group = db.ReferenceProperty(Groups, collection_name='topics')
class Pro(db.Model):
pro_user = db.UserProperty()
pro_content = db.StringProperty(multiline=True)
pro_date = db.IntegerProperty(default=0)
pro_topic = db.ReferenceProperty(Topics, collection_name='pros')
class Con(db.Model):
con_user = db.UserProperty()
con_content = db.StringProperty(multiline=True)
con_date = db.IntegerProperty(default=0)
con_topic = db.ReferenceProperty(Topics, collection_name='cons')
そして、実際のページの1つの機能として、グループのリストを表示し、トピックの下に表示します:
class Summary(webapp.RequestHandler):
def get(self):
groups_query = Groups.all()
groups = groups_query.fetch(1000)
template_values = {
'groups': groups,
}
path = os.path.join(os.path.dirname(__file__), 'summary.html')
self.response.out.write(template.render(path, template_values))
そして最後にhtml:
<html>
<body>
<a href="/newgroup">New Group</a>
<br>
{% for group in groups %}
<font size="24">{{ group.group_name|escape }}</font><br> by <b>{{ group.group_user }}</b> at <b>{{ group.group_date }}</b> {{ group.raw_id }}
<br>
<a href="/newtopic?id={{group.key.id}}" >New topice </a>
<br>
<blockquote>
{{ topics.topics_name }}
</blockquote>
{% endfor %}
</body>
</html>
解決
ストアの変更(たとえば、新しいオブジェクトの作成など)などの副作用があるものは、HTTP GET
である必要はない NOT &quot; read&quot;オペレーション。これは物足りなさではなく、HTTPセマンティクスの重要な部分です。ブラウザ、キャッシュ、プロキシなどは、読み取り専用操作としてGETを実行できます(たとえば、結果をキャッシュし、サーバーにリクエストを渡さない場合)キャッシュで満たすことができます)。
変更には、POSTなどのHTTP動詞(本質的にすべてのブラウザーが正しく実装しているために最も人気があります)またはPUT(新しいオブジェクトを作成する)またはDELETE(オブジェクトを削除する)を使用します。さまざまなブラウザをサポートするためにPOSTを使用すると想定しています。
ブラウザからPOSTを取得するには、Javascriptウィザードまたはmethod = postを使用した単純な古いフォームのいずれかが必要です-簡単にするために後者を想定します。
Django 1.0(アプリエンジンが現在サポートしている)を使用している場合、モデルに基づいてフォームを作成、検証、受け入れる独自のメカニズムがあります。他のフレームワークには、独自の同様に高度なレイヤーがあります。
「リッチ」を避けたい場合HTMLフォーム用のテンプレートを手作業で実装する必要があるフレームワークは、 def post(self)で実装するハンドラーに(app.yamlなどのURLディスパッチの何らかの種類を介して)指示します:
、リクエストからデータを取得、検証、新しいオブジェクトを形成、配置、確認ページを表示します。
手順のどの部分が不明確ですか?あなたの質問のタイトルは特に参照プロパティに焦点を当てていますが、それらが特にあなたに与えている問題はわかりません-あなたがそれらについて正しいタックにあるように見えるあなたの質問のテキストから。
編集:OPはコメントで、彼の問題は次のようなものを作成する方法であることを明確にしました:
"<a href="/newtopic?id={{group.key.id}}" >New topic </a>"
仕事。それを行うには複数の方法があります。 newtopic URLが静的フォームによって提供される場合、投稿&quot; action&quot;のハンドラーは、その形式の id =
に Referer:
ヘッダー(悪名高いが修正不可能なスペルミス)を介して戻ることができますが、それは少し不格好で壊れやすいです。より良いのは、 def get
がリクエストから id =
を取得し、結果のフォームテンプレートに挿入するハンドラーによってnewtopic URIを提供することです。たとえば、非表示の入力フィールド。そのフォームのテンプレートに(他のフィールドの中に)含める:
<INPUT TYPE=hidden NAME=thegroupid VALUE={{ theid }}> </INPUT>
そのテンプレートをレンダリングするコンテキストに theid
を置くと、フォームを受け取るアクションの def post
が最終的に取得するリクエストに含まれます。
他のヒント
他の人の質問に答えるだけで、おそらくこれを理解できたでしょう:
class NewTopic(webapp.RequestHandler): def get(self): groupId = self.request.get('group') # either get the actual group object from the DB and initialize topic with topic_group=object as in 'Nick Johnson's answer, or do as follows topic = Topic() topic.name = self.request.get("topicname") topic.reference = groupId topic.put()
返信ありがとう。
ええ、私はget vs postを知っています。私が投稿したクラスは、実際にすべてのGroups()を印刷することでした。
私が抱えている問題は、グループを使用して、モデルをどのように使用してデータを階層的な方法で保持するかがわからないことです&gt;トピック&gt;長所/短所。
データの取得は非常に簡単で、私は使用しています:
class NewGroupSubmit(webapp.RequestHandler):
def post(self):
group = Groups()
if users.get_current_user():
group.group_user = users.get_current_user()
group.group_name = self.request.get('groupname')
group.put()
self.redirect('/summary')
新しいトピックを追加して、そのグループ内に保存する別の関数が必要です。したがって、グループが「車」であるとしましょう。例えば;トピックは「フェラーリ」、「ポルシェ」、「BMW」、各トピックの賛否両論です。私は少しあいまいなことに気付いていますが、それはリレーショナルデータベースに非常に慣れていないためであり、用語にあまり慣れていません。
どのような問題が発生しているのかよくわかりません。リストするものはすべて問題なく表示されます。ReferencePropertiesは、記述から期待されるものに従って設定されます。私が見ることができる唯一の問題は、テンプレートで、どこでも定義されていない変数&quot; topics&quot;を参照しており、グループのトピックをどこでも繰り返し処理していないことです。次のようにできます:
<html>
<body>
<a href="/newgroup">New Group</a>
<br>
{% for group in groups %}
<font size="24">{{ group.group_name|escape }}</font><br> by <b>{{ group.group_user }}</b> at <b>{{ group.group_date }}</b> {{ group.raw_id }}
<br>
<a href="/newtopic?id={{group.key.id}}" >New topice </a>
<br>
Topics:
<ul>
{% for topic in group.topics %}
<li>{{topic.topic_name}}</li>
{% endfor %}
</ul>
{% endfor %}
</body>
</html>
新しいトピックを作成するには、コンストラクタを使用して、必要な引数を渡します。
mytopic = Topic(topic_name="foo", topic_group=somegroup)
ここで、somegroupはGroupオブジェクト、またはGroupオブジェクトのキーのいずれかでなければなりません。