【问题标题】:key.from_path equivalent to get_by_id in GAE datastorekey.from_path 等效于 GAE 数据存储中的 get_by_id
【发布时间】:2014-03-15 06:08:02
【问题描述】:

我在 GAE 的数据存储中有以下模型:

class Blog(db.Model):
    subject = db.StringProperty(required = True)
    content = db.TextProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)  
    last_modified = db.DateTimeProperty(auto_now = True)

我用以下类创建一个新帖子:

class NewPostHandler(Handler):
    def render_newpost(self, subject="", content="", error=""):
        self.render("newpost.html", subject=subject, content=content, error=error)

    def get(self):
        self.render_newpost()

    def post(self):
        subject = self.request.get("subject")
        content = self.request.get("content")
        if subject and content:
            a = Blog(parent = blog_key(), subject=subject, content=content)
            a.put() 
            self.redirect("/blog/%s" %str(a.key().id()))
        else:
            error = "we need both a subject and some text!"
            self.render_newpost(subject, content, error)

我用这段代码来定义一个键:

def blog_key(name = 'default'):
    return db.Key.from_path('blogs', name)

我的问题是在尝试渲染它时,以下使用 get_by_id 有效:

class PermalinkHandler(Handler):
    def get(self, blog_id):
        blog = Blog.get_by_id(int(blog_id), parent=None)
    if not blog:
         self.response.write('There is no blog whose id is %s' %blog_id)
         return
        self.render("permalink.html", blog = blog)

当我尝试用

替换 blog = Blog.get_by_id(int(blog_id), parent=None)
k = db.Key.from_path('Blog', int(blog_id), parent=blog_key())
blog = db.get(k)

它不起作用,知道为什么吗? 谢谢

【问题讨论】:

  • 两个建议:使用 webap2、NDB 和使用时使用 default_value self.request.get('subscribe', default_value=None)

标签: google-app-engine python-2.7 google-cloud-datastore


【解决方案1】:

显而易见的问题是您是否在工作代码中提供了父级。

def get(self, blog_id):
        blog = Blog.get_by_id(int(blog_id), parent=None)

查看您的代码,父级始终为 None,并且在您的帖子处理程序中,您没有向我们展示您如何创建 blog_key

然后在你的非工作代码中你有

k = db.Key.from_path('Blog', int(blog_id), parent=blog_key())
blog = db.get(k)

所以我的猜测是问题是由于您的密钥中使用的父级不一致。

【讨论】:

  • 我有点困惑,因为似乎实体创建是使用父键完成的。
  • @TimHoffman 我确实向您展示了 blog_key() 是如何创建的,它在以下代码中: def blog_key(name = 'default'): return db.Key.from_path('blogs', name)
  • OK 错过了这一点,因此您在 PermalinkHandler 中检索的方式之间存在明显差异,因为它似乎没有在我能看到的任何地方设置父级。但是,您声称要在 post 处理程序中设置父级。您是否为博客实体获取了一些密钥并检查了这些密钥以查看它们是否有父实体。如果实体有父级并且您不提供它们,则 get_by_id 无法工作。
  • 最初在 NewPostHandler 中,读取“a = Blog(parent = blog_key(), subject=subject, content=content)”的代码行不包括“parent = blog_key()”为什么 PermalinkHandler 包含“blog = Blog.get_by_id(int(blog_id), parent=None)”。我现在尝试将不包含 blog_key() 的原始版本替换为包含 blog_key() 的原始版本,因此我尝试了解使用 key.from_path 的 get_by_id 的等价物。希望这很清楚?!
  • 实际上用 'blog = Blog.get_by_id(int(blog_id), parent=blog_key())' 替换:'blog = Blog.get_by_id(int(blog_id), parent=None)' 有效,但我的问题是试图理解 key.from_path
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多