当只有其中一些对象存在属性时如何迭代 GQLQuery 对象

How to iterate over GQLQuery objects when an attribute exists for only some of them

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

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个entry,其中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)。所以 属性 似乎存储在数据存储区中。

我遇到的问题是解释器在 MainPage()-

get 中为循环抛出 AttributeError
AttributeError: 'GqlQuery' object has no attribute 'coords'

我认为这可能是因为某些条目首先没有 coords 属性。但如果是这样的话,有什么办法可以解决吗?

如果有用的话,我正在为 Steve Huffman 的 Udacity 网络开发课程做这个,他展示了这种存储和显示用户坐标的方法。他指示不要将 required=True 用于 coords 属性,因为已经存在的条目没有 属性。当他遍历博客中的条目时,一切似乎都很好,所有坐标都显示为 list.

我设法解决了这个问题。

我在 MainPage 中使用了 filter 而不是 for 循环。

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

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

编辑:我找到了我的原始代码出现问题的原因。应该是 e.coords,而不是 entries.coords