Google App Engine ReferenceProperty关系


问题内容

我正在尝试使用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):,得到来自请求的数据,对其进行验证,形成新对象,将其放入,显示一些确认页面。

您不清楚程序的哪一部分?您问题的标题专门针对参考属性,但我不确定它们特别给您带来什么问题-从问题的文字来看,您似乎对它们有正确的选择。

编辑 :OP现在已在注释中澄清了他的问题是如何制作类似以下内容的内容:

"<a href="/newtopic?id={{group.key.id}}" >New topic </a>"

工作。有多种方法可以做到这一点。如果newtopic
URL由静态表单提供,则该表单的“操作”处理程序可以id=通过Referer:标头返回(臭名昭著但无法解决的错误拼写),但这有点笨拙且脆弱。更好的方法是让处理程序提供newtopic
URI,该处理程序从请求中def get获取id=并将其插入到生成的表单模板中,例如,在隐藏的输入字段中。使该表单的模板包含(在其他字段中):

<INPUT TYPE=hidden NAME=thegroupid VALUE={{ theid }}> </INPUT>

放置theid在您用来渲染该模板的上下文中,并且最终将def post收到表单请求的操作的请求。