我正在编写一个应用程序来比较产品,使用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>
我不确定我是否提供了足够的信息,但我想开始解决这个问题。如果需要更多信息来帮助调试,请告诉我。
我也很开心我认为这完全错了。我正在考虑重写整个事情,但我已经接近“完成”基本功能,我想尝试解决这个问题。
由于
答案 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)))