Google 应用引擎参考属性关系 [英] Google app engine ReferenceProperty relationships

查看:26
本文介绍了Google 应用引擎参考属性关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 ReferenceProperty 使我的模型相关联,但运气不佳.我有 3 个级别:组、主题、优点和缺点.因为在一个小组中有许多主题,每个主题中可能有许多优点和缺点.

I'm trying to get my models related using ReferenceProperty, but not have a huge amount of luck. I have 3 levels: Group, Topic, then Pros, and Cons. As in a Group houses many topics, and within each topic could be many Pros and Cons.

我能够很好地存储新组,但我不知道如何在这些组下存储主题.我想从一个页面链接到每个组下方的新主题"链接,这会将它们带到一个简单的表单(现在只有 1 个字段).显然,该 URL 需要对组的 id 或其他内容进行某种引用.

I am able to store new Groups nice and fine, but I don't have any idea how to store topics underneath these groups. I want to link from a page with a link "New topic" underneath each group, that takes them to a simple form (1 field for now). Obviously the URL will need to have some sort of reference to the id of the group or something.

这是我的模型:

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')    

实际页面的一个功能我想显示组列表,然后在它们的主题下面:

And one function for the actual page I want to show the list of Groups, and then underneath their topics:

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>

推荐答案

有副作用的东西,例如改变存储(例如通过创建一个新对象)应该NOT是一个 HTTP GET -- GET 本质上应该只执行读取"操作.这不是迂腐,它是 HTTP 语义的一个关键点——浏览器、缓存、代理等,被允许作为只读操作对 GET 进行操作(例如,通过缓存结果而不将请求传递给服务器,如果它们可以从缓存中满足.

Something that has side effects, such as altering the store (by creating a new object for example) should NOT be an HTTP GET -- GET should essentially only do "read" operations. This isn't pedantry, it's a key bit of HTTP semantics -- browsers, caches, proxies, etc, are allowed to act on GET as read-only operations (for example by caching results and not passing a request to the server if they can satisfy it from cache).

对于修改,请使用 HTTP 动词,例如 POST(最流行的主要是因为所有浏览器都正确实现了它)或用于特殊操作 PUT(创建新对象)或 DELETE(删除对象).我假设您将使用 POST 来支持各种浏览器.

For modifications, use HTTP verbs such as POST (most popular essentially because all browsers implement it correctly) or for specialized operations PUT (to create new objects) or DELETE (to remove objects). I assume you'll be going to use POST to support a variety of browsers.

要从浏览器获取 POST,您需要 Javascript 向导或带有 method=post 的普通旧形式——为简单起见,我将假设后者.

To get a POST from a browser, you need either Javascript wizardy or a plain old form with method=post -- I'll assume the latter for simplicity.

如果您使用的是 Django 1.0(应用引擎现在支持),它有自己的机制来创建、验证和接受基于模型的表单.其他框架也有自己类似的高级层.

If you're using Django 1.0 (which app engine supports now), it has its own mechanisms to make, validate and accept forms based on models. Other frameworks have their own similarly advanced layers.

如果你想避免丰富"的框架,你必须为你的 HTML 表单手动实现模板,将它们(通过某种 URL 调度,例如在 app.yaml 中)定向到你的处理程序,使用def post(self):,从请求中获取数据,验证它,形成新对象,放置它,显示一些确认页面.

If you want to avoid "rich" frameworks you'll have to implement by hand templates for your HTML forms, direct them (via some kind of URL dispatching, e.g. in app.yaml) to a handler of yours implementing with a def post(self):, get the data from the request, validate it, form the new object, put it, display some acknowledgment page.

您不清楚程序的哪一部分?您的问题的标题专门针对参考属性,但我不确定它们给您带来的具体问题是什么——从您的问题文本来看,您似乎对它们的看法是正确的.

What part or parts of the procedure are unclear to you? Your question's title focuses specifically on reference properties but I'm not sure what problem they are giving you in particular -- from the text of your question you appear to be on the right tack about them.

编辑:OP 现在在评论中澄清说他的问题是如何制作类似的东西:

Edit: the OP has now clarified in a comment that his problem is how to make something like:

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

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

work. There's more than one way to do that. If the newtopic URL is served by a static form, the handler for the post "action" of that form could get back to that id= via the Referer: header (a notorious but unfixable mis-spelling), but that's a bit clunky and fragile. Better is to have the newtopic URI served by a handler whose def get gets the id= from the request and inserts it in the resulting form template -- for example, in a hidden input field. Have that form's template contain (among the other fields):

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

theid 放在您渲染该模板的上下文中,它将在接收表单的操作的 def post 最终获得的请求中.

put theid in the context with which you render that template, and it will be in the request that the def post of the action receiving the form finally gets.

这篇关于Google 应用引擎参考属性关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆