1

さて、ここで問題です。私はこのコードを持っています

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 に設定する必要がありますが、これは非効率的です。

誰もこれに対する回避策を知っていますか?

4

2 に答える 2

2

エラーの理由 (ご想像のとおり) は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))

問題は、それぞれを個別に繰り返し処理するchoiceことですが、それをリスト全体 ( value) と比較しています。

私の提案は、リストをプロパティに割り当てる方法を変更することです。たとえば、次の代わりに:

book.categories = ['engineering','mathematics']

次のようなことを試してください:

for category in ['engineering','mathematics']:
    book.categories.append(category)

にはリストが含まれているため、ListProperty各項目を個別に追加して、前述のコードのテストに合格することができます。私のテストでこれを機能させるには、モデルを少し異なる方法でセットアップする必要がありましたが、上記のエラーに到達できれば、appendメソッドは正常に機能するはずです。

それは少し単純ではありませんが、私は同意しますが、上記の問題を回避し、うまくいけばうまくいくはずです.

于 2012-11-28T03:33:00.093 に答える
0

キーのリストを使用して、多対多の関係を作成します。のキーのリストとしてのcategoriesプロパティを使用します。class Bookclass Category

class Book(db.Model)
    title = db.StringProperty(required=True)
    author = db.StringProperty()
    isbn = db.StringProperty()

    # List Of Keys
    categories = db.ListProperty(db.Key)

class Category(db.Model)
    name = db.StringProperty(choices = ('science', 'engineering', 'math'))

モデリングの詳細とコードサンプルについては、https ://developers.google.com/appengine/articles/modelingをご覧ください。

于 2012-11-28T04:07:30.257 に答える