2011-08-16 38 views
1

我bulkloader.yaml看起來是這樣的:谷歌的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看起來像這樣

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查看數據。所以數據上傳並存在。我也看到了外鍵。

我無法根據父對象訪問子數據。它返回空。粘貼下面就是我一直在交互式控制檯上的本地開發數據存儲執行:

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

你已經發布了兩個完全不同的問題。請把它們分開。您還需要包含第一個問題的完整堆棧跟蹤和第二個問題的模型定義。 –

+0

刪除了第一個問題,併爲第二個問題添加了模型定義。謝謝。 –

+0

您是否嘗試迭代'b = Bid.gql(「WHERE listid =:1,h.key())'而不是h.biddings? –

回答

0

好吧,我發現我在做什麼錯。 在我的bulkloader.yaml中,我將實體稱爲模型而不是實物。

一旦我用

- kind: Home 

代替

- model: models.Home 

而且我用key_is_id =真在兩個外鍵引用來解決尋找父母和孩子的數據的問題。

現在,這是我如何訪問我的父母和子女的數據

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

現在加入此作品「for x in h.biddings: print x.bidtext」 –