0

我很困惑如何过滤和显示一对多的关系。如何遍历一对多关系查询结果?

this questionthis articleand 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() 

返回,我需要使用该项目的关键。如何获得该项目的urltitle等?我该如何显示它?

更新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) 
+0

检查应用的过滤器,你有 'query.filter( “标签”, “华丽”)',改变它“query.filter(”标签=“,”魅力“)' – 2011-01-28 20:03:34

+0

@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

回答

1

这里需要两个循环。 query是标签对象的列表。每个对象本身都有一个项目列表。所以你需要循环通过query,然后通过每个标签的项目。

但是,还有第二个问题:ReferenceProperty是错误的方法。据我所知,ReferenceProperty就像普通Django中的ForeignKey:换句话说,是一种一对多关系,其中定义属性的模型是关系的“一侧”。但是您似乎需要为每个标记指定多个项目,然后再循环:因此您需要将ReferenceProperty放置在Item模型上。

然后,你可以做你的两个循环:

for tag in query: 
    self.response.out.write('header for tag %s' % tag.tag) 
    for item in tag.image_tags: 
     self.response.out.write('detail for each item')