谷歌应用程序引擎中的python - 具有类而非实例问题,但使用db.Model因此无法创建init方法

时间:2010-12-28 15:57:22

标签: python google-app-engine list set

我正在编写一个应用程序来比较产品,使用Python和GAE。产品将属于一组类似的产品,应用程序会计算每组中的最佳值。

当我创建新产品时,可以将其添加到现有集合中,也可以创建新集合。

在测试应用时,第一组创建得很好。我使用产品名称填充集合的实例。我在一个网页上使用表单将数据发布到“suppbook”页面。我还不清楚网页如何成为一个类,但这是一个不同的问题。

所有这些代码都有更多代码,但我正在努力使我的问题尽可能清晰。

class Supp(db.Model):
    name             = db.StringProperty(multiline=False)
    # a bunch of other attributes using Google's DB Model

class SuppSet(db.Model):
    name       = db.StringProperty(default='')
    supp_list  = set([])
    # a bunch of other attributes using Google's DB Model        

    # i tried to add this after reading a few questions on SO but GAE doesn't like it
    def __init__(self,):
       self.name       = 'NoName'
       self.best_value = 'NoBestValue'
       self.supp_list  = set([])

Class Suppbook(webapp.RequestHandler):
def post(self):
    supp             = Supp()
    suppSet          = SuppSet()
...
    supp.name          = self.request.get('name')
    supp.in_set        = self.request.get('newset')
    suppSet.name       = supp.in_set
    suppSet.supp_list.add(supp.name)
    self.response.out.write('%s now contains %s<p>' % (suppSet.name,suppSet.supp_list))

第一次使用效果很好,如果我只使用一个SuppSet,我可以添加许多支持。但是,如果我创建了另一个SuppSet,则suppSets的{​​{1}}内容将具有相同的内容。我一直在查看这里的问题,我认为(知道)我在类与实例属性访问方面做错了。我尝试为supp_list创建__init__方法,但GAE抱怨: AttributeError:'SuppSet'对象没有属性'_entity'

另外,我使用GAE数据存储区来放置()和get()Supps和SuppSets,所以我不清楚为什么我没有采取我应该从数据库中提取的唯一实例。< / p>

我不确定我是否提供了足够的信息,但我想开始解决这个问题。如果需要更多信息来帮助调试,请告诉我。

我也很开心我认为这完全错了。我正在考虑重写整个事情,但我已经接近“完成”基本功能,我想尝试解决这个问题。

由于

2 个答案:

答案 0 :(得分:0)

在你的 init 中你需要调用super的 init ,db.Model在 init 中有一些重要的事情,你将必须匹配签名。

但是你可能不应该在那里设置默认值之类的东西。尝试使用数据存储区属性设置默认值。

答案 1 :(得分:0)

你的代码中有一些(我假设)错别字。 Python对case和white-space很敏感。您使用的属性名称也与您的defs不匹配,例如in_set。如果可能,请发布展示您问题的实际工作示例。

class Supp(db.Model):
    name = db.StringProperty(multiline=False)
    in_set = db.StringProperty(multiline=False)
    # your other stuff ...

class SuppSet(db.Model):
    name       = db.StringProperty(default='')
    supp_list  = db.StringListProperty()
    # your other stuff ...

    # In Python, you need to explicitly call the parent's __init__ with your args.
    # Note that this is NOT needed here.
    def __init__(self, **kwargs):
       db.Model.__init__(self, **kwargs)


class Suppbook(webapp.RequestHandler):
    def post(self):
        # This will create a NEW Supp and SuppSet every request,
        # it won't fetch anything from the datastore.
        # These are also NOT needed (included for explanation)
        supp = Supp()
        suppSet = SuppSet()

        # It sounds like you want something like:
        product_name = self.request.get('name')
        product_set = self.request.get('newset')

        # check for missing name / set:
        if not product_name or not product_set:
           # handle the error 
           self.error(500)
           return

        # Build the keys and batch fetch.
        supp_key = db.Key.from_path('Supp', product_name)
        suppset_key = db.Key.from_path('SuppSet', product_set)
        supp, suppset = db.get([supp_key, suppset_key])
        if not supp:
             supp = Supp(key_name=product_name,
                         name=product_name)

        if not suppset:
             suppset = SuppSet(key_name=product_set,
                               name=product_set)

        # Update the entities
        supp.in_set = product_set
        if product_name not in suppset.supp_list:
            suppset.supp_list.append(product_name)

        # Batch put...
        db.put([supp, suppset])


        self.response.out.write('%s now contains %s<p>' % (suppset.name, str(suppset.supp_list)))