0

我是編程新手,我試圖掌握GAE數據存儲的概念。我正在嘗試構建一個應用程序,以便輕鬆寫入合同(http://contractpy.appspot.com)。在那一刻,我路過我需要呈現從URL合同模板中的所有值,這樣一來:如何查詢GAE數據存儲以呈現模板(新手級別)

self.redirect('/your_contract?person=%s&nacionality=%s&profession=%s&maritalStatus=%s&SSN=%s&driverLicense=%s&email=%s&witness=%s&owner=%s&contractType=%s&address=%s' % (person_name, user_nacionality, user_profession, user_maritalStatus, user_SSN, user_driverLicense, user_email, 
#witness, owner, contractType, address)) 

但這樣做,但它仍然僅限於一個人(和,在未來,我我們需要在同一份合同中提交幾個人的數據)。

而不是這樣做,我想使用GAE數據存儲查詢來填充模板「your_contract.html」的變量值。我知道這是一個簡單的問題,但GAE數據存儲對我來說是完全隱晦的(我還沒有把握「數據存儲的禪宗」,但我理解了一點SQL),而且我現在正在學習OOProgramming 。我讀this article,我試着按照this sample(Google guess_booK樣本),但他們對這個大腦還不夠。那麼,執行此查詢的最佳方式是在一個模板中呈現多個人數據? (類人是在代碼波紋管)

我是這樣想的:通過URL列表,與每個人的一個數據(例如:駕駛執照號碼):

self.redirect('/your_contract?driverLicense=%s' % (driverLicenseList)) 

而且,在處理程序「your_contract」,用「diverLicenseList」的值(後相互作用的列表)來查詢數據存儲GAE,像這樣:

x = self.request.get('SSN') 
contractingParty = db.GqlQuery("SELECT FROM Person WHERE SSN IS x") 

這是正確的道路? 在此先感謝您的幫助!

我的原代碼(GAE做查詢之前)是在這裏:

# -*- coding: utf-8 -*- 
# -*- coding: utf-8 -*- 
#!/usr/bin/env python 
# 
# Copyright 2007 Google Inc. 
# 
# Licensed under the Apache License, Version 2.0 (the "License"); 
# you may not use this file except in compliance with the License. 
# You may obtain a copy of the License at 
# 
#  http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
# See the License for the specific language governing permissions and 
# limitations under the License. 
# 

import os 

import webapp2 

import jinja2 

jinja_environment = jinja2.Environment(autoescape=True, 
    loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) 

import re 

from google.appengine.ext import db 

USER_RE = re.compile(r"^[a-zA-Z0-9_ -]{3,20}$") 
def valid_person(person): 
    return USER_RE.match(person) 

PASS_RE = re.compile(r"^.{3,20}$") 
def valid_SSN(SSN): 
    return PASS_RE.match(SSN) 

EMAIL_RE = re.compile(r"^[\S][email protected][\S]+\.[\S]+$") 
def valid_email(email): 
    return EMAIL_RE.match(email) 

import time 

import datetime 

def dateToday(): 
    today = datetime.datetime.today() 
    todayDay = str(today.day) 
    todayMonth = str(today.month) 
    monthExt = {'1':' January ', '2':'February', '3':' March ', '4':'April', '5':'May', '6':'June', '7':' July ', '8':'August', '9':'September', '10':'October', '11':'November ', '12':'December'} 
    todayYear = str(today.year) 
    return(todayDay + ' of ' + monthExt[todayMonth] + ' of ' + todayYear) 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     template_values = {"person": "", 
             "SSN": "", 
             "driverLicense": "", 
             "email":"", 
             "person_error": "", 
             "SSN_error": "", 
             "driverLicense_error": "", 
             "address": "", 
             "email_error": ""} 
     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 

    def post(self): 
     person_name = self.request.get("person") 
     user_nacionality = self.request.get('nacionality') 
     user_profession = self.request.get('profession') 
     user_maritalStatus = self.request.get('maritalStatus') 
     user_SSN = self.request.get('SSN') 
     user_email = self.request.get('email') 
     user_driverLicense = self.request.get('driverLicense') 
     person_error = "" 
     SSN_error = "" 
     driverLicense_error = "" 
     geted_email_error = "" 
     address = self.request.get('address') 
     contractType = self.request.get("contractType") 
     owner = self.request.get("owner") 
     witness = self.request.get("witness") 

     if (person_name and valid_person(person_name)) and (user_SSN and valid_SSN(user_SSN)) and ((not user_email) or (user_email and valid_email(user_email))): 
      a = People(firstName = person_name, 
            nacionality = user_nacionality, 
            maritalStatus = user_maritalStatus, 
            profession = user_profession, 
            SSN = int(user_SSN), 
            driverLicense = int(user_driverLicense) 
            #address = user_address 
            ) 
      a.put() 
      self.redirect('/your_contract?person=%s&nacionality=%s&profession=%s&maritalStatus=%s&SSN=%s&driverLicense=%s&email=%s&witness=%s&owner=%s&contractType=%s&address=%s' % (person_name, user_nacionality, user_profession, user_maritalStatus, user_SSN, user_driverLicense, user_email, 
witness, owner, contractType, address)) 

     else: 
      if not person_name or not valid_person(person_name): 
       person_error = "Oh no!!! this person name isn't valid!" 
      if not user_SSN or not valid_SSN(user_SSN): 
       SSN_error = "Oh no!!! SSN isn't valid!" 
      if user_email and not valid_email(user_email): 
       geted_email_error = "Oh no!!! e-mail isn't valid!" 
      template_values = {"person": person_name, 
           "nacionality": user_nacionality, 
           "maritalStatus": user_maritalStatus, 
           "profession": user_profession, 
           "SSN": user_SSN, 
           "driverLicense": user_driverLicense, 
           "email": user_email, 
           "person_error": person_error, 
           "SSN_error": SSN_error, 
           "driverLicense_error": user_driverLicense, 
           "address": address, 
           "email_error": geted_email_error} 
      template = jinja_environment.get_template('index.html') 
      self.response.out.write(template.render(template_values)) 

class your_contractHandler(webapp2.RequestHandler): 
    def get(self): 
     geted_person_name = self.request.get('person') 
     geted_user_nacionality = self.request.get("nacionality") 
     geted_user_profession = self.request.get("profession") 
     geted_user_maritalStatus = self.request.get("maritalStatus") 
     geted_user_SSN = self.request.get('SSN') 
     geted_user_email = self.request.get('email') 
     geted_user_driverLicense = self.request.get('driverLicense') 
     geted_person_error = "" 
     geted_SSN_error = "" 
     geted_driverLicense_error = "" 
     geted_address = self.request.get('address') 
     geted_owner = self.request.get("owner") 
     geted_witness = self.request.get("witness") 
     geted_contractType = self.request.get("contractType") 
     geted_dateToday = dateToday() 
     your_contract = jinja_environment.get_template('your_contract.html') 
     your_contract_values = {"person":geted_person_name, 
           "nacionality":geted_user_nacionality, 
           "maritalStatus": geted_user_maritalStatus, 
           "profession": geted_user_profession, 
           "SSN":geted_user_SSN, 
           "driverLicense":geted_user_driverLicense, 
           "address":geted_address, 
           "email":geted_user_email, 
           "contractType":geted_contractType, 
           "dateContract":geted_dateToday, 
           } 
     template = jinja_environment.get_template('index.html') 
     self.response.out.write(your_contract.render(your_contract_values)) 

class People(db.Model): 
    name = db.StringProperty(required = True) 
    nacionality = db.StringProperty(required = True) 
    maritalStatus = db.StringProperty(required = True) 
    profession = db.StringProperty(required = True) 
    SSN = db.IntegerProperty(required = True) 
    driverLicense = db.IntegerProperty(required = True) 
# address = db.PostalAdressProperty(required = True) 
# condition = db.StringProperty(required = False, choices=set(["buyer", "seller", "renter", "owner", "witness"])) 

##class Acts(db.Model): 
## firstPart = db.StringProperty(required = True) 
## secondPart = db.StringProperty(required = True) 
## contractNumber = db.IntegerProperty(required = False) 
## contractDate = db.DateProperty(auto_now_add=True) 
## contractDraft = db.TextProperty(required = True) 


app = webapp2.WSGIApplication([('/', MainHandler), ('/your_contract', your_contractHandler)], 
           debug=True) 

回答

1

有在你的代碼的幾個問題,開始設計。

你應該有越來越存儲到數據存儲(合同和Person) 兩個類(如果您正在使用NDB你可以有與所述人員的結構化物業合同,但我們會保持簡單。)

合同可能有你需要的任何東西的合同,然後有一個 人=的ListProperty(db.Key)

後你把()的模型實例db.key()將與填充鍵。這就是你應該傳遞給代碼的其他部分並存儲在上面的ListProperty中。

例如在您的重定向的POST之後你會像 self.redirect( '/ your_contract?人=%s' 的%a.key()')

要加載存儲的人你會做: person = db.get(self.request.get('person'))

如果你傳遞多個人密鑰,你必須仔細檢查webob文檔,瞭解如何使用同一個密鑰讀取多個值在querystring中,但我知道它回來作爲一個列表。

希望這會有所幫助