0

1対多リレーションをフィルタリングして表示する方法が混乱しています。 this questionthis article1対多のリレーションクエリの結果をループする方法は?

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に二つの新しいアイテムを追加し、テーブルには、次のようになります。

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を

を[OK]を、私はキーを取得する方法を考え出し参照項目の名前:

 for tag in query: 
      self.response.out.write(ID is: %s" % (tag.item.key())) 

ので

tag.item.key() 
私が使用する必要がある項目のキーを返します

。どのようにしてそのアイテムのurltitleなどを取得できますか?そしてそれをどのように表示するのですか?

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

注:名前はTagこのitemが基準列を参照混乱さ:

更新4

これは、(少なくとも1つのタグの)動作するように見えます

referenced_item_key = tag.item.key() 

私はこの項目を別の名前にする必要があります:

item = Item.get(referenced_item_key) 
+0

チェック適用されるフィルタ、あなたは、「query.filter( 『タグ』、 『グラム』)を」持っている「(query.filter」のためにそれを変更しますtag = "、" glam ") ' –

+0

@eiefai:ここで述べたように" = "を付けずにクエリが動作するhttp://stackoverflow.com/questions/4829138/how-to-make-the-argument-to-filter-a- variable/4829203#4829203私のUpdate 2では、タグが "glam"として正しく返されていることがわかります。 – Zeynel

+1

'tag.item'はアイテムです。あなたはその鍵を取得する必要はありません、それからもう一度それをフェッチしてください。 –

答えて

1

ここに2つのループが必要です。 queryはTagオブジェクトのリストです。各オブジェクト自体にはアイテムのリストがあります。したがって、queryをループし、各タグの項目をループする必要があります。

しかし、2番目の問題があります。ReferencePropertyは、間違った方法です。私が理解しているように、ReferencePropertyは通常のDjangoのForeignKeyと似ています。つまり、プロパティを定義するモデルが関係の「片側」である一対多の関係です。しかし、各タグに複数のItemが必要なように見えるので、ループします。したがって、ItemPropertyを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') 
+0

答えをありがとう。私は各項目の詳細を記入してこれを試しましたが、エラーが発生します。私は更新します。 – Zeynel

+0

これは間違っています。各タグには明らかに1つの項目があります。ネストされたループは必要ありません。 –

関連する問題