2011-08-16 3 views
1

私bulkloader.yamlは、次のようになります。のGoogle AppEngineの、子モデルからデータを取得することはできません

- import: models 

transformers: 
- model: models.Company 
    connector: csv 
    connector_options: 
    encoding: utf_8 
    columns: from_header 
    property_map: 
    - property: __key__ 
     external_name: companyid 
     import_transform: int 
     export_transform: transform.key_id_or_name_as_string 

    - property: name 
     external_name: name  

- model: models.Home 
    connector: csv 
    connector_options: 
    encoding: utf_8 
    columns: from_header 
    property_map: 
    - property: __key__ 
     external_name: listid 
     import_transform: int 
     export_transform: transform.key_id_or_name_as_string 

    - property: companyid 
     external_name: companyid 
     import_transform: transform.create_foreign_key('Company') 
     export_transform: transform.key_id_or_name_as_string  

    - property: address 
     external_name: address  

- model: models.Bid 
    connector: csv 
    connector_options: 
    encoding: utf_8 
    columns: from_header 
    property_map: 
    - property: __key__ 
     external_name: listid 
     import_transform: int  
     export_transform: transform.key_id_or_name_as_string 

    - property: listid 
     external_name: listid 
     import_transform: transform.create_foreign_key('Home',key_is_id=True)  
     export_transform: transform.key_id_or_name_as_string 

    - property: bidtext 
     external_name: bidtext  
     import_transform: db.Text 

私のmodels.pyは、私は私の地元のdevの上のデータをアップロードしたこの

from google.appengine.ext import db 

# Models 
class Company(db.Model): 
    """Models a real estate company""" 
    companyid = db.Key() 
    name = db.StringProperty() 

class Home(db.Model): 
    """Models an apartment, house, villa etc and its selling details""" 
    listid = db.Key() 
    companyid = db.ReferenceProperty(Company, collection_name='company') 
    address = db.StringProperty() 

class Bid(db.Model): 
    """Models bidding against a listid from Home model""" 
    listid = db.ReferenceProperty(Home, collection_name='biddings') 
    bidtext = db.TextProperty() 

のように見えますサーバーと私はhttp://localhost:9999/_ah/admin/datastoreを使用してデータを表示できます。したがって、データはアップロードされ、存在します。私は外来の鍵も見る。

親オブジェクトに基づいて子データにアクセスすることができません。空を返します。貼り付けの下には、私が地元のdevのデータストア上のインタラクティブコンソールで実行されているものです:

from google.appengine.ext import db 
from models import Home,Bid,Company 

#can access parent data from child i.e. Home 
bd = Bid.get_by_id(4242) 
hhh = Home.get_by_id(int(bd._listid.name())) 
print hhh.state 

#Again, can access parent data from child i.e. Company 
h = Home.get_by_id(4242) 
print h.address 
c = Company.get_by_id(int(h._companyid.name())) 
print c.website 

#Cannot find any data here (biddings is a collection name defined in Bid model) 
b = Bid.gql("WHERE listid = :1", h) 
for x in h.biddings: 
    print x.bidtext 

出力:

London 
Riverview 24, 
http://www.houses.com/ 
+0

あなたは2つの全く異なる質問を投稿しました。それらを分けてください。また、最初の質問には完全なスタックトレースを、2番目の質問にはモデル定義を含める必要があります。 –

+0

最初の質問を削除し、2番目の質問にモデル定義を追加しました。ありがとう。 –

+0

h.biddingsの代わりに 'b = Bid.gql( "where listid =:1"、h.key())を反復してみましたか? –

答えて

0

さてさて、私は私が間違って何をしていたかが分かりました。 私のbulkloader.yamlでは、私は実体ではなくモデルとしてエンティティを参照していました。

私は

- kind: Home 

代わりの

- model: models.Home 

を使用したら、また、私は親と子のデータを見つける問題を解決するために、両方の外部キー参照でkey_is_id = Trueのを使用。

は今、これは私がこの背後に多くの時間を無駄に原因これは私のようないくつかのnoobを役に立てば幸い私は私の親と子のデータにアクセスする方法

from google.appengine.ext import db 
from models import Home,Bid,Company 

#get home object 
h = Home.get_by_id(4242) 
print h.address 

#get parent values 
print h.companyid.website 

#get child values 
b = Bid.gql("WHERE listid = :1", h.key()) 
for xb in b: 
    print xb.bidtext 

です。 このスレッドに返信する時間があった皆さん、ありがとうございます。

+0

これを今すぐ追加する "h.biddingsのxのために: print x.bidtext" –

関連する問題