gpt4 book ai didi

python - 如何向 Google 数据存储 StringListProperty 添加选项?

转载 作者:行者123 更新时间:2023-12-01 05:52:44 25 4
gpt4 key购买 nike

好吧,问题就在这里。我有这个代码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com