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

时间:2010-07-07 22:30:45

标签: 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)

另一个看起来像这样:

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)

我正在尝试通过附加这样的帖子来更新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()

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

AttributeError: 'Feed' object has no attribute 'posts'

我之所以感到困惑的原因是因为我在向'UserClass'添加'Feed'时几乎有了确切的逻辑,其中'UserClass'将'Feeds'指定为ListProperty,其方式与'Feed'相同有一个'Post'被指定为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)

这很好用:

if blog.key() not in user.feeds:
    user.feeds.append(blog.key())
    user.put()

这会引发错误:

if post.key() not in blog.posts:
    blog.posts.append(post.key())
    blog.put()

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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

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

[datastore_types.Key.from_path(u'Post', 7, _app=u'helow')]

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

请尽可能简单地showstheproblem.py (即,没有重现问题不是必不可少的代码!),这会显示问题,并编辑您的问题以添加该问题代码(减去模型,我们已经看过那些,当然绝大多数字段与这个问题完全无关)。

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