Google App Engine(Python)类“对象没有属性”错误令人困惑
我有两个类。
第一个类看起来是这样的:
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
文件,尽量简单(也就是说,不要包含任何不必要的代码,只保留能重现问题的部分!),展示出这个问题,并编辑你的提问,把这段代码加上去(模型的部分就不用再加了,我们已经看过了,而且它们的大部分字段和这个问题完全无关)。
这是报告疑似错误或寻求帮助的正确方式;通常情况下,你会发现,在精简你的代码以获得“最小可重现问题的代码”的过程中... 问题会消失,这样你就能明白最开始你的代码哪里出了问题——所以你甚至不需要再请求帮助或者报告这个库里根本不存在的错误!-)