如果只为其中一些属性存在属性,如何迭代GQLQuery对象

时间:2016-05-30 09:45:28

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

所以我正在构建一个基本博客,我还实现了一个IP地址API来存储用户的位置。我已经使用this website的API来获取用户的经度和纬度。这是Entries类,用于存储每个条目 -

class Entries(db.Model):
    title = db.StringProperty(required = True)
    body = db.TextProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)
    coords = db.GeoPtProperty()

这是将纬度和经度存储在coords属性 -

中的函数
IP_URL = 'http://ip-api.com/xml/'
def get_coords(ip):
    ip = '4.2.2.2'
    url = IP_URL + ip
    content = None
    try:
        content = urllib2.urlopen(url).read()
    except urllib2.URLError:
        return
    if content:
        # parse the XML and find the coordinates
        dom = minidom.parseString(content)
        status = dom.getElementsByTagName("status")[0].childNodes[0].nodeValue
        if status == 'success':
            lonNode = dom.getElementsByTagName('lon')[0]
            latNode = dom.getElementsByTagName('lat')[0]
            if lonNode and latNode and lonNode.childNodes[0].nodeValue and latNode.childNodes[0].nodeValue:
                lon = lonNode.childNodes[0].nodeValue
                lat = latNode.childNodes[0].nodeValue
                return db.GeoPt(lat, lon)

当我转到管理页面(localhost:8000)时,我可以看到某些条目具有coords属性,而其他条目则没有。 (确切地说,我目前有8个条目,其中6个在coords列中没有任何内容,1个的坐标为4.2.2.2,另一个有None,因为我已经通过了我的localhost地址。)

我有一个主页面,其中列出了博客中的所有条目,我在这里试图查看是否可以实际获得存储在数据库中的所有坐标,以显示在页面上 -

class MainPage(webapp2.RequestHandler):
    def get(self):
        # self.response.write(self.request.remote_addr)
        # self.response.write(repr(get_coords(self.request.remote_addr)))
        entries = db.GqlQuery('select * from Entries order by created desc limit 10')
        # find which entries have coordinates
        points = []
        for e in entries:
            if entries.coords:
                points.append(a.coords)

        self.response.write(repr(points))
        self.response.write(render_str('mainpage.html', entries=entries))

我尝试打印出属性本身 - self.response.write(repr(get_coords(self.request.remote_addr)))并显示datastore_types.GeoPt(40.7128, -74.0059)。因此,似乎属性IS存储在数据存储区中。

我遇到的问题是解释器在AttributeError的{​​{1}}中为循环抛出get -

MainPage()

我认为这可能是因为某些条目首先没有AttributeError: 'GqlQuery' object has no attribute 'coords' 属性。但如果是这样的话,有什么办法吗?

如果它有用,我正在为Steve Huffman的Udacity开发Web开发课程,他展示了这种存储和显示用户坐标的方法。他指示不要将coords用于required=True属性,因为现有条目没有该属性。当他在博客中查看条目时,一切似乎都很好,所有坐标都显示为coords

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题。

我在filter内使用了for代替MainPage循环。

points = filter(None, (e.coords for e in entries))

这似乎有效并显示了坐标列表。 (虽然我仍然不明白为什么这种方法有效)

编辑:我发现为什么我的原始代码出现了问题。它应该是e.coords,而不是entries.coords