簡體   English   中英

Google App Engine ReferenceProperty關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM