[英]Google app engine ReferenceProperty relationships
我正在嘗試使用ReferenceProperty獲取相關的模型,但運氣不佳。 我有3個級別:小組,主題,然后是優點和缺點。 因為在一個小組中包含許多主題,並且在每個主題中可能有許多優點和缺點。
我可以很好地存儲新的網上論壇,但是我不知道如何在這些網上論壇下存儲主題。 我想從一個頁面鏈接到每個組下面的“新主題”鏈接,該鏈接將它們帶到一個簡單的表單(目前為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')
我想在實際頁面上顯示一個功能,以顯示“組”列表,然后在其主題下:
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
-GET本質上應該只執行“讀取”操作。 這不是繁瑣的事情,而是HTTP語義的關鍵部分-瀏覽器,緩存,代理等都可以作為只讀操作(例如,通過緩存結果並且不將請求傳遞給服務器,則以只讀操作)可以從緩存中滿足)。
要進行修改,請使用HTTP動詞,例如POST(之所以流行,主要是因為所有瀏覽器都正確實現了該動詞),或者用於特殊操作PUT(用於創建新對象)或DELETE(用於刪除對象)。 我假設您將要使用POST來支持各種瀏覽器。
要從瀏覽器獲取POST,您需要Javascript向導或帶有method = post的普通舊表單-為了簡單起見,我將假定后者。
如果您使用的是Django 1.0(應用引擎現在支持),則它具有自己的機制,可以基於模型制作,驗證和接受表單。 其他框架也有自己類似的高級層。
如果您要避免使用“豐富”框架,則必須手動為HTML表單實現模板,請將它們(通過某種URL分配,例如在app.yaml中)定向到您的使用def post(self):
實現的處理程序def post(self):
:,從請求中獲取數據,對其進行驗證,形成新對象,將其放入,顯示一些確認頁面。
您不清楚程序的哪一部分? 您問題的標題專門針對參考屬性,但我不確定它們特別給您帶來什么問題-從問題的文本來看,您似乎對它們有正確的選擇。
編輯 :OP現在已在注釋中澄清,他的問題是如何制作類似以下內容的內容:
"<a href="/newtopic?id={{group.key.id}}" >New topic </a>"
工作。 有多種方法可以做到這一點。 如果newtopic URL由靜態表單提供,則該表單的“操作”處理程序可以通過Referer:
標頭返回到該id=
(臭名昭著但無法解決的錯誤拼寫),但這有點笨拙,並且脆弱。 更好的方法是讓處理程序提供newtopic URI,該處理程序的def get
從請求中獲取id=
並將其插入到生成的表單模板中,例如在隱藏的輸入字段中。 使該表單的模板包含(在其他字段中):
<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()。
我遇到的問題是我不確定如何使用模型通過組>主題>優點/缺點來以某種分層方式保留數據。
抓取數據非常簡單,我正在使用:
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')
我需要另一個函數來添加新主題,並將其存儲在該組中。 因此,可以說一個小組是“汽車”。 主題可能是“法拉利”,“保時捷”,“寶馬”,然后是每個主題的利弊。 我意識到自己有點含糊,但這是因為我對關系數據庫非常陌生,並且不習慣該術語。
我不太確定您遇到什么問題。 您列出的所有內容看起來都很不錯-ReferenceProperties是根據您的預期設置的。 我可以看到的唯一問題是,在模板中,您引用的是變量“ topics”,該變量未在任何地方定義,也沒有在任何地方遍歷組的主題。 您可以這樣做:
<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對象的鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.