如何使用谷歌应用引擎更新数据存储区中的列名称

时间:2013-11-04 23:28:50

标签: python google-app-engine google-cloud-datastore

我有一个带有coloumn名称geocode的实体,它最初是空值。 我想更新数据存储区中地理编码coloumn的值。

我尝试使用下面的代码片段,但它没有用。请帮忙。提前谢谢。

数据存储区

class doctor(db.Model):
doctorUser=db.UserProperty()
    geocode=db.GeoPtProperty()

更新医生颜色的功能

def post(self):
    user=users.get_current_user()
    q=doctor.all().filter("doctorUser =",user)
    if q.count()==1:
        lat=self.request.get('lat')
        lng=self.request.get('long')
        code=str(lat)+", "+str(lng)
        q[0].geocode=code
        q[0].put()

解决

这是我所做的改变,并且有效!

def post(self):
    user=users.get_current_user()
    q=doctor.all().filter("doctorUser =",user)
    qo=q.get()
    if q.count()==1:
        lat=self.request.get('lat')
        lng=self.request.get('long')
        code=str(lat)+", "+str(lng)
        qo.geocode=code
        qo.put()

1 个答案:

答案 0 :(得分:1)

您正在尝试处理查询对象,您需要获取或迭代查询或使用get()获取结果。您正在使用的查询可能会返回多个结果。除非您在其他地方有逻辑以确保doctorUser的唯一值。

在进入循环之前,还要从请求中获取lat / long。

您还应该根据列名称停止考虑数据存储区和模型。这些是实体的属性,appengine数据存储区中没有列。

虽然您更新原始问题的解决方案可能会有效但效率低下。例如,您获得一个实体然后执行count()重新运行相同的查询。我已将其重写为更高效,但仍存在潜在问题(例如匹配doctorUser = user的多个记录

def post(self):
    user=users.get_current_user()

    if user:  # if user not logged in user will be None

       qo=doctor.all().filter("doctorUser =",user).fetch(10)

       if len(go) > 1:
           raise ValueError('More than one doctorUser matches')

       if go:
           lat=self.request.get('lat')
           lng=self.request.get('long')
           code=str(lat)+", "+str(lng)
           qo.geocode=code
           qo.put()