作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,问题就在这里。我有这个代码
list_categories = [None,"mathematics","engineering","science","other"]
class Books(db.Model)
title = db.StringProperty(required=True)
author = db.StringProperty()
isbn = db.StringProperty()
categories = db.StringListProperty(default=None, choices = set(list_categories))
例如,我想要在这里做的是让我的 book.categories 成为列表类别的子集我有一本书,其类别应该是“工程”和“数学”,但是当我设置
book.categories = ['engineering','mathematics']
webapp2 给了我一个错误
BadValueError: Property categories is ['engineering','mathematics']; must be one of set([None,"mathematics","engineering","science","other"])
我最初的猜测是我必须将 list_choices 设置为 [None,"mathematics","engineering","science","other"] 的 POWERSET,但这效率太低了。
有人知道解决这个问题的方法吗?
最佳答案
错误的原因(我相信您已经猜到了)是 StringListProperty
没有对 choices
关键字参数进行任何特殊处理 - 它只是将其传递给 ListProperty
构造函数,后者又将其传递给 Property
构造函数,并在其中对其进行求值:
if self.empty(value):
if self.required:
raise BadValueError('Property %s is required' % self.name)
else:
if self.choices:
match = False
for choice in self.choices:
if choice == value:
match = True
if not match:
raise BadValueError('Property %s is %r; must be one of %r' %
(self.name, value, self.choices))
问题在于,它会单独迭代每个选择
,但会将其与整个列表(值
)进行比较,这永远不会导致匹配,因为字符串不等于列表(同样,你知道这一点:))。
我的建议是修改将列表分配给属性的方式。例如,而不是:
book.categories = ['engineering','mathematics']
尝试这样的事情:
for category in ['engineering','mathematics']:
book.categories.append(category)
由于 ListProperty
包含一个列表,因此您可以单独附加每个项目,以便它通过上述代码中的测试。请注意,为了让它在我的测试中工作,我必须以稍微不同的方式设置模型 - 但是如果您可以遇到上面提到的错误,那么 append
方法应该工作正常。
我同意,这使得事情变得不那么简单,但它应该可以规避上述问题并希望能够发挥作用。
关于python - 如何向 Google 数据存储 StringListProperty 添加选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13597014/
我是一名优秀的程序员,十分优秀!