谷歌应用引擎(python)令人困惑的类'对象没有属性'错误

Tir*_*ton 1 python google-app-engine

我有2节课.
一个看起来像这样:

class Feed(db.Model):
    bid = db.StringProperty()
    title = db.StringProperty()
    url = db.StringProperty()
    datecreated = db.DateProperty(auto_now_add=True)
    voice = db.StringProperty()
    lastchecked = db.DateProperty(auto_now=True)
    language = db.StringProperty()
    active = db.BooleanProperty()
    posts = db.ListProperty(db.Key)
Run Code Online (Sandbox Code Playgroud)

另一个看起来像这样:

class Post(db.Model):
    title = db.StringProperty()
    postdate = db.DateTimeProperty()
    author = db.StringProperty()
    body = db.TextProperty()
    link = db.LinkProperty()
    hasmp3 = db.BooleanProperty()
    mp3location = db.StringProperty()
    processed = db.BooleanProperty()
    voice = db.StringProperty()
    length = db.FloatProperty()
    inprocess = db.BooleanProperty()
    haspict = db.BooleanProperty()
    pictures = db.ListProperty(db.Key)
Run Code Online (Sandbox Code Playgroud)

我试图通过附加这样的帖子来更新Feed:

blogid = cgi.escape(self.request.get('bid'))
postid = cgi.escape(self.request.get('pid'))

blog = Feed.get_by_key_name(blogid)
post = Post.get_by_key_name(postid)

if post.key() not in blog.posts:
    blog.posts.append(post.key())
    blog.put()
Run Code Online (Sandbox Code Playgroud)

当我试图用博文信息'放'博客时,python不喜欢它并告诉我

AttributeError: 'Feed' object has no attribute 'posts'
Run Code Online (Sandbox Code Playgroud)

我之所以如此困惑的原因是因为我在向'UserClass'添加'Feed'时几乎有了确切的逻辑,其中'UserClass'将'Feeds'指定为ListProperty,就像'Feed'具有''一样'发布'指定为ListProperty.

这是我的意思的一个例子:

class UserClass(db.Model):
    synccode = db.StringProperty()
    firstname = db.StringProperty()
    lastname = db.StringProperty()
    address = db.StringProperty()
    address2 = db.StringProperty()
    city = db.StringProperty()
    state = db.StringProperty()
    zipcode = db.StringProperty()
    emailaddress = db.StringProperty()
    password = db.StringProperty()
    mobile = db.StringProperty()
    is_authenticated = db.BooleanProperty()
    groupid = db.StringProperty() 
    mobilesynched = db.BooleanProperty()
    devicemodel = db.StringProperty()
    isatmoscast = db.BooleanProperty() 
    registerdate = db.DateProperty(auto_now_add=True) 
    pack = db.StringProperty()
    personalcontact = db.BooleanProperty()
    lastlogin = db.DateProperty(auto_now_add=True)
    isactive = db.BooleanProperty()
    feeds = db.ListProperty(db.Key)
Run Code Online (Sandbox Code Playgroud)

这很好用:

if blog.key() not in user.feeds:
    user.feeds.append(blog.key())
    user.put()
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

if post.key() not in blog.posts:
    blog.posts.append(post.key())
    blog.put()
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Ale*_*lli 5

我把你的模型粘贴在一个"hello world"main.py中; 然后在本地SDK上运行它,我进入交互式控制台:

import main as m

p = m.Post()
p.put()
f = m.Feed()
f.put()

if p.key() not in f.posts:
    f.posts.append(p.key())
    f.put()

print f.posts
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,我在右侧的结果窗口中看到:

[datastore_types.Key.from_path(u'Post', 7, _app=u'helow')]
Run Code Online (Sandbox Code Playgroud)

换句话说,似乎无法在简单的情况下重现您报告的问题.

请一个showstheproblem.py,尽可能简单(即没有代码,这不是必不可少重现该问题!),这说明了什么问题,并编辑您的问题添加代码(减去模型,我们已经看到的,当然还有他们绝大多数的领域与这个问题完全无关).

这始终是报告疑似错误或获取帮助的正确方法; 通常情况下,你会发现在削减你的代码副本以获得"最小可能的问题再现"的过程中......问题以一种向你显示错误的方式消失首先是您的代码 - 所以您实际上甚至不必向库中请求帮助或报告不存在的错误! - )