【问题标题】:GAE returns Nonetype when entity clearly exists in datastore当实体明确存在于数据存储中时,GAE 返回 Nonetype
【发布时间】:2013-12-22 22:33:42
【问题描述】:

当用户创建一个新事件时,他们输入“event_name”和“event_time”并从下拉列表中选择位置。然后,我从与该位置匹配的 PlaceModel 实例中检索事件的纬度和经度。

问题是,当我要查找的 PlaceModel 实例存在时,localhost 返回 Nonetype。

我的模型:

class PlaceModel(db.Model):
    place_name = db.StringProperty(required = True)
    place_lat = db.StringProperty(required = True)
    place_long = db.StringProperty(required = True)
    def render(self):
        return render_str("placemodel.html", p = self)

class EventModel(db.Model):
    event_place = db.ReferenceProperty(PlaceModel)

    event_name = db.StringProperty(required = True)
    event_time = db.StringProperty(required = True)
    def render(self):
        return render_str("eventmodel.html", e = self)

html:

<select name = "place_name">
{% for place in allplaces %}
    <option name = "place_name" value = {{place_name}}> {{place.place_name}}</option>
{%endfor%}
</select>

蟒蛇:

class NewEvent(Handler):
   def get(self):
        if self.user:
            allplaces = PlaceModel.all()
            self.render("newevent.html", allplaces = allplaces)
        else:
            self.redirect("/signup")

   def post(self):
        event_name = self.request.get("event_name")
        event_time = self.request.get("event_time")
        place_name = self.request.get_all("place_name")

        if event_name and event_time and place_name:
            place_lat = PlaceModel.gql("where place_name = :place_name", place_name = place_name).get().place_lat
            place_long = PlaceModel.gql("where place_name = :place_name", place_name = place_name).get().place_long

            event_place = PlaceModel(parent = place_key(), 
                            place_name = place_name, place_lat = place_lat, place_long = place_long)

            event = EventModel(parent = event_key(),
                    event_name = event_name, event_time = event_time, 
                    event_place = event_place)

            event.put()
            stat = "your event has been recorded"
            self.render('newevent.html', stat = stat)
        else:
            allplaces = PlaceModel.all()

            error = "fill in all the boxes"
            self.render("newevent.html", error = error, allplaces = allplaces,
                        event_name = event_name, event_time = event_time)

怎么了??为什么 gql 返回 nonetype?

编辑: 错误日志的(后半部分):

File "/Users/yingjiefu/Documents/munchkin/munchkin.py", line 195, in post
    place_lat = PlaceModel.gql("where place_name = :place_name", place_name = place_name).get().place_lat
AttributeError: 'NoneType' object has no attribute 'place_lat'

编辑:现在可以使用了!

蟒蛇:

class NewEvent(Handler):
   def get(self):
        if self.user:
            allplaces = PlaceModel.all()
            self.render("newevent.html", allplaces = allplaces)
        else:
            self.redirect("/signup")

   def post(self):
        event_name = self.request.get("event_name")
        event_time = self.request.get("event_time")
        place_name = self.request.get("place_name")

        if event_name and event_time and place_name:
            place = PlaceModel.all().filter("place_name", place_name).get()
            place_lat = place.place_lat
            place_long = place.place_long


            event = EventModel(parent = event_key(),
                    event_name = event_name, event_time = event_time, 
                    event_place = place)

            event.put()
            stat = "your event has been recorded"
            allplaces = PlaceModel.all()
            self.render('newevent.html', stat = stat, allplaces = allplaces)
        else:
            allplaces = PlaceModel.all()

            error = "fill in all the boxes"
            self.render("newevent.html", error = error, allplaces = allplaces,
                        event_name = event_name, event_time = event_time)

html:

<select name = "place_name" >
{% for place in allplaces %}
    <option value = "{{ place.place_name }}">{{ place.place_name }}</option>
{% endfor %}
</select>

【问题讨论】:

  • 错误的确切全文是什么?

标签: python google-app-engine jinja2


【解决方案1】:

这段代码有很多问题。

我希望主要在于您如何定义选项中的值。您不仅没有用引号括起来,而且实际上使用了一个不存在的变量:place_name。它应该是这样的:

<option name="place_name" value="{{place_name}}">{{place.place_name}}</option>

其次,在从请求中提取 place_name 值时使用 get_all()。据我了解,它返回一个 list,因此您将在 GQL 的占位符中有多个值。您应该使用get(),就像对其他变量一样。

第三,与您的问题无关,但您为什么要两次执行完全相同的查询?无缘无故地花费你两倍的成本。获取一次并将其存储在变量中:

place = PlaceModel.gql("where place_name = :place_name", place_name=place_name).get()
place_lat = place.place_lat
place_long = place.place_long

(我什至不会问您为什么要使用 GQL 而不是普通的 Query 语法,后者会更短:PlaceModel.all().filter('place_name', place_name) - 您确实意识到它们都被翻译成相同的 RPC 调用,而 GQL 不是'不比模型版本更“原生”吗?)

【讨论】:

  • 在尝试了正常的查询语法后,我切换到了 gql,因为我收到一条错误消息,提示您无法过滤列表。我将 get_all() 更改为 get(),但现在它没有为“place_name”获得任何值,并且我得到错误页面重新渲染。 (我也添加了引号)
  • 另外,place_name 怎么不存在?这是 PlaceModel 的必需属性,我从下拉列表中检索它的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多