2017-01-25 59 views
1

我試圖在GAE上創建ndb中的1對多關係。當我將鍵分配給ndb.KeyProperty時,爲什麼會出現BadValueError?

當我試圖向Customer.client_id財產客戶端密鑰拋出這個錯誤:

*** BadValueError:預期列表或元組,得到密鑰( '客戶',5629499534213120)

import sys, pprint 
pprint.pprint(sys.path) 
from flask import Flask 
from flask import Flask, render_template, request, session 

app = Flask(__name__) 
app.secret_key = 'superSecretKey' 
from google.appengine.ext import ndb 

class Client(ndb.Model): 
    email = ndb.StringProperty() 
    name = ndb.StringProperty(indexed=True) 
    signup = ndb.DateTimeProperty(auto_now_add=True) 

class Customer(ndb.Model): 
    client_id = ndb.KeyProperty(kind=Client, repeated=True) 
    email = ndb.StringProperty() 
    name = ndb.StringProperty(indexed=True) 
    signup = ndb.DateTimeProperty(auto_now_add=True) 

# this just creates a Client to use 
if not (Client.query(Client.name == "Bryan Wheelock").get()): 
client = Client( 
    email = "[email protected]", 
    name = "Bryan Wheelock", 
).put() 

@app.route('/') 
def main_page(): 
    client = Client.query(Client.name == "Bryan Wheelock").get() 
    session['client'] = client.key.urlsafe() 
    return render_template('index.html', 
     client=client 
    ) 


@app.route('/submitted', methods=['POST']) 
def submitted_form(): 
    client = ndb.Key(urlsafe=session['client']).get() 
    print "###########################################" 
    print("client.key = " + str(client.key)) 
    customer = Customer() 
    customer.client_id = client.key 
    customer.name = request.form.get('id_name') 
    customer.put() 

    return render_template('submitted_form.html', 
     client=client, 
     customer=customer 
    ) 



    @app.errorhandler(500) 
    def server_error(e): 
     # Log the error and stacktrace. 
     logging.exception('An error occurred during a request.') 
     return 'An internal error occurred.', 500 


     ERROR 2017-01-25 16:10:39,337 main.py:82] An error occurred during a request. 
     Traceback (most recent call last): 
     File "/Users/bryanwheelock/work/flask_TDD/lib/flask/app.py", line 1988, in wsgi_app 
      response = self.full_dispatch_request() 
     File "/Users/bryanwheelock/work/flask_TDD/lib/flask/app.py", line 1641, in full_dispatch_request 
      rv = self.handle_user_exception(e) 
     File "/Users/bryanwheelock/work/flask_TDD/lib/flask/app.py", line 1544, in handle_user_exception 
      reraise(exc_type, exc_value, tb) 
     File "/Users/bryanwheelock/work/flask_TDD/lib/flask/app.py", line 1639, in full_dispatch_request 
      rv = self.dispatch_request() 
     File "/Users/bryanwheelock/work/flask_TDD/lib/flask/app.py", line 1625, in dispatch_request 
      return self.view_functions[rule.endpoint](**req.view_args) 
     File "/Users/bryanwheelock/work/flask_TDD/main.py", line 65, in submitted_form 
      customer.client_id = client.key 
     File "/Users/bryanwheelock/work/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1400, in __set__ 
      self._set_value(entity, value) 
     File "/Users/bryanwheelock/work/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1141, in _set_value 
      (value,)) 
    BadValueError: Expected list or tuple, got Key('Client', 5629499534213120) 

回答

2

在您的客戶模型實體必須

client_id = ndb.KeyProperty(kind=Client, repeated=True) 

反覆=你將不得不密鑰列表而不是一個真正的關鍵手段。所以,你需要取出重複= True或你需要有這樣的:

customer.client_id = [client.key] 

,或者如果它不是一個新的實體

customer.client_id.append(client.key) 
相關問題