0

我正在使用 google-app-engine webapp,部分代码是:

class Post(db.Model):
    title = db.StringProperty(required=True)
    def categories(self):
        return (x.category for x in self.postcategory_set)

class Category(db.Model):
    name = db.StringProperty()

class PostCategory(db.Model):
    post = db.ReferenceProperty(Post)
    category = db.ReferenceProperty(Category)


class sss(webapp.RequestHandler):
  def get(self):
    obj1 = Post(title='hhaa')
    #obj1.title = 'haha'
    obj1.put()

    obj2 = Category()

    obj2.name='haha-kao'

    obj2.put()
    obj3=PostCategory()
    obj3.post=obj1
    obj3.category=obj2
    obj3.put()
    self.response.out.write(obj1.categories().get().name)

但我收到一个错误:

Traceback (most recent call last):
  File "D:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 511, in __call__
    handler.get(*groups)
  File "D:\zjm_code\helloworld\a.py", line 131, in get
    self.response.out.write(obj1.categories().get().name)
AttributeError: 'generator' object has no attribute 'get'

那么我怎样才能获得我写的 genexp 的所有值呢?

4

2 回答 2

1

这是categories().next()你需要的。发电机没有get.

于 2010-05-11T03:13:04.137 回答
1

如果你想要一个all方法,你应该返回一个列表推导而不是生成器:

return [x.category for x in self.postcategory_set]

但是因为postcategory_set已经是一个可迭代的(因为你迭代了它)

return self.postcategory_set

会更自然,但这会给调用者一个对您的私有、可变数据的引用,除非在这种情况下Post.postcategory_set不是真正的set类型,而是一个实例,google.app.engine.ext.db.Query它确实是可迭代但不可变的。

而且您没有问,但是您的模型很有趣,当您可以拥有 PostCategory 表时,它是不必要的:

class Post(db.Model):
    title = db.StringProperty(required=True)
    category = db.ReferenceProperty(Category)
    def categories(self):
        return list(self.postcategory_set)

并完全下降PostCategory

于 2010-05-11T07:58:26.947 回答