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')