Google App Engine(Python)类“对象没有属性”错误令人困惑

1 投票
1 回答
1461 浏览
提问于 2025-04-16 00:58

我有两个类。
第一个类看起来是这样的:

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)

我想通过添加一个帖子来更新一个动态,代码是这样的:

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'

我之所以感到困惑,是因为我在将“动态”添加到“用户类”的时候,几乎用的是完全相同的逻辑。在这个例子中,“用户类”里有一个“动态”,它被指定为一个列表属性,就像“动态”里有一个“帖子”被指定为一个列表属性一样。

这是我所说的一个例子:

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 个回答

5

我把你的模型放进了一个简单的“你好,世界”主程序 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 文件,尽量简单(也就是说,不要包含任何不必要的代码,只保留能重现问题的部分!),展示出这个问题,并编辑你的提问,把这段代码加上去(模型的部分就不用再加了,我们已经看过了,而且它们的大部分字段和这个问题完全无关)。

这是报告疑似错误或寻求帮助的正确方式;通常情况下,你会发现,在精简你的代码以获得“最小可重现问题的代码”的过程中... 问题会消失,这样你就能明白最开始你的代码哪里出了问题——所以你甚至不需要再请求帮助或者报告这个库里根本不存在的错误!-)

撰写回答