我对如何过滤和显示一对多关系感到困惑。在
继this question和this article(and my previous question)之后,除了Item
,我还创建了一个新的ReferenceProperty Tag
:
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
添加了两个新项,现在表如下所示:
在我的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
列下。我怎么拿到那个身份证?我试过了
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()
我应该给这个项目起个别的名字:
^{14}$
这里需要两个回路。
query
是标记对象的列表。每个对象本身都有一个项目列表。所以您需要遍历query
,然后遍历每个标记的项。在然而,还有第二个问题:ReferenceProperty是错误的。据我所知,ReferenceProperty就像普通Django中的ForeignKey:换句话说,一个一对多关系,其中定义属性的模型是关系的“一”侧。但您似乎需要为每个标记添加多个项,然后循环遍历这些项:因此需要将ReferenceProperty放在项模型上。在
然后,您可以执行两个循环:
相关问题 更多 >
编程相关推荐