当只有其中一些对象存在属性时如何迭代 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
。
所以我正在构建一个基本博客,其中我还实现了一个 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
。