无法从加载到应用引擎数据存储区的实体进行查询

时间:2009-10-28 12:26:45

标签: python google-app-engine

我是python的新手。我无法从实体中查询 - UserDetails和PhoneBook我加载到app引擎数据存储区。我在下面根据Brett关于“在GAE上开发和部署应用程序”的youtube视频编写了这个UI - shoutout应用程序。好吧,我只是尝试进行一些逆向工程来从数据存储区查询,但每一步都失败了。

#!/usr/bin/env python

import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
import models

class showPhoneBook(db.Model):
    """ property to store user_name from UI to persist for the session """ 
    user_name = db.StringProperty(required=True)

class MyHandler(webapp.RequestHandler):
    def get(self):
        ## Query to get the user_id using user_name retrieved from UI ##
        p = UserDetails.all().filter('user_name = ', user_name)
        result1 = p.get()
        for itr1 in result1:
            userId = itr.user_id
        ## Query to get the phone book contacts using user_id retrieved ##
        q = PhoneBook.all().filter('user_id = ', userId)
        values = {
            'phoneBookValues': q
        }
        self.request.out.write(
            template.render('phonebook.html', values))
    def post(self):
        phoneBookuser = showPhoneBook(
            user_name = self.request.get('username'))
        phoneBookuser.put()
        self.redirect('/')

def main():
    app = webapp.WSGIApplication([
        (r'.*',MyHandler)], debug=True)
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
    main()

这是我的models.py文件,我在其中定义了UserDetails和PhoneBook类,

#!/usr/bin/env python

from google.appengine.ext import db

#Table structure of User Details table
class UserDetails(db.Model):
  user_id = db.IntegerProperty(required = True)
  user_name = db.StringProperty(required = True)
  mobile_number = db.PhoneNumberProperty(required = True)

#Table structure of Phone Book table
class PhoneBook(db.Model):
  contact_id = db.IntegerProperty(required=True)
  user_id = db.IntegerProperty(required=True)
  contact_name = db.StringProperty(required=True)
  contact_number = db.PhoneNumberProperty(required=True)

以下是我面临的问题,
1)我无法在get(self)方法中调用user_name(从UI-- phoneBookuser = showPhoneBook(user_name = self.request.get('username'))检索),以查询UserDetails以获取相应的user_name。 2)从models.py文件导入时,代码无法识别UserDetails和PhoneBook类 3)我试图在main.py文件本身中定义UserDetails和PhoneBook类,我在result1 = p.get()得到错误BadValueError: Unsupported type for property : <class 'google.appengine.ext.db.PropertiedClass'>

自从2周以来,我一直在努力克服陷入困境但却徒劳无功。请帮我理清我的代码('因为我觉得我写的是一个容易出错的代码)。

2 个答案:

答案 0 :(得分:3)

我建议您阅读GAE找到的here的Python文档。

一些意见:

  1. 要使用models.py中的模型,您需要使用前缀models.(例如models.UserDetails)或使用

    导入它们

    来自模型导入*

  2. MyHandler.get()
  3. 您没有查找username获取参数

  4. 要获取与查询相对应的值,请执行p.fetch(1)而非p.get()

  5. 您还应该阅读Reference properties in GAE。我建议您将模型设为:

    class UserDetails(db.Model):
        user_name = db.StringProperty(required = True)
        mobile_number = db.PhoneNumberProperty(required = True)
    
    #Table structure of Phone Book table
    class PhoneBook(db.Model):
         user = db.ReferenceProperty(UserDetails)
         contact_name = db.StringProperty(required=True)
         contact_number = db.PhoneNumberProperty(required=True)
    

    然后您的MyHandler.get()代码将如下所示:

    def get(self):
        ## Query to get the user_id using user_name retrieved from UI ##
        user_name = self.request.get('username')
        p = UserDetails.all().filter('user_name = ', user_name)
        user = p.fetch(1)[0]
        values = {
            'phoneBookValues': user.phonebook_set
        }
        self.response.out.write(template.render('phonebook.html', values))
    

    (不用说,你需要处理在数据库中找不到用户名的情况)

  6. 我不太明白showPhoneBook模型的观点。

答案 1 :(得分:1)

存储到数据存储区的“会话变量”不会遵循您的重定向;你必须从你的get()处理程序中的数据存储区中获取它,尽管没有在cookie中设置会话ID或者根本不会实现会话,而是允许任何人获得/使用任何值发送POST请求是否是由他们或其他人发送的。为什么要使用重定向;响应POST请求应该在post()方法中完成,而不是通过重定向到GET方法。