我很困惑如何过滤和显示一对多的关系。如何遍历一对多关系查询结果?
继this question和this article(and my previous question),我创建了一个新的ReferenceProperty Tag
除了Item
:
class Item(db.Model):
...
title = db.StringProperty()
url = db.StringProperty()
image_source_url = db.StringProperty()
....
class Tag(db.Model):
item = db.ReferenceProperty(Item, collection_name = "image_tags")
tag = db.StringProperty()
我添加了两个新项目,以Tag
和表格现在看起来是这样的:
Key: ahNzYz...
ID: 269
Key Name:
item: ahNzYXJh...
Item: id=268
tag: glam
Key: ahNxyz...
ID: 270
Key Name:
item: ahNzYXJh...
Item: id=264
tag: casual
在我的SortFormHandler
我做这个查询,并尝试循环的结果:
class SortFormHandler(webapp.RequestHandler):
def get(self):
query = Tag.all()
query.filter("tag", "glam")
for item in query.image_tags:
self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" %
(item.url, item.image_source_url, item.title) )
这给属性错误:
AttributeError: 'Query' object has no attribute 'image_tags'
我试过其他的组合没有成功。我很感激,如果有人可以解释这是如何工作的,以便我了解如何循环播放结果。
谢谢。
更新
我想丹尼尔·罗斯曼的answer这样的:
for tag in query:
self.response.out.write("tag is: %s" % tag.tag)
for item in tag.image_tags:
self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" %
(item.url, item.image_source_url, item.title) )
但是这给
AttributeError: 'Tag' object has no attribute 'image_tags'
有关如何解决这个问题有什么建议?
更新2
我看到,在Tag
表所引用的项目的ID列item
下储存。我如何获得该ID?我试图
tag.item
在这一行
for tag in query:
self.response.out.write("tag is: %s. ID is: %s" % (tag.tag, tag.item))
但这只是返回对象:
tag is: glam. ID is: <__main__.Item object at 0x06875EB0>
更新3
好吧,我想通了如何拿到钥匙参考项目名称:
for tag in query:
self.response.out.write(ID is: %s" % (tag.item.key()))
所以
tag.item.key()
返回,我需要使用该项目的关键。如何获得该项目的url
和title
等?我该如何显示它?
更新4
这似乎工作(至少对于1个标记):
for tag in query:
referenced_item_key = tag.item.key()
item = Item.get(referenced_item_key)
self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" %
(item.url, item.image_source_url, item.title) )
注:名称被混淆本item
指参考列在Tag
:
referenced_item_key = tag.item.key()
我应该命名这个项目别的:
item = Item.get(referenced_item_key)
检查应用的过滤器,你有 'query.filter( “标签”, “华丽”)',改变它“query.filter(”标签=“,”魅力“)' – 2011-01-28 20:03:34
@eiefai:查询作品没有”=“在这里提到http://stackoverflow.com/questions/4829138/how-to-make-the-argument-to-filter-a-变量/ 4829203#4829203您可以在我的更新2中看到该标记作为“glam”正确返回。 – Zeynel 2011-01-28 20:20:09