Google appengine, не удается получить данные из дочерней модели

Мой файл bulkloader.yaml выглядит так:

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

person Nikhil S    schedule 16.08.2011    source источник
comment
Вы задали два совершенно разных вопроса. Пожалуйста, отделите их. Вам также необходимо включить полную трассировку стека для первого вопроса и определения модели для второго.   -  person Nick Johnson    schedule 17.08.2011
comment
Удален первый вопрос и добавлены определения модели для второго. Благодарю.   -  person Nikhil S    schedule 17.08.2011
comment
Вы пробовали повторять "b = Bid.gql (WHERE listid =: 1, h.key ())" вместо h.biddings?   -  person Kevin P    schedule 23.08.2011
comment
Я пробовал b = Bid.gql (WHERE listid =: 1, h.key ()) для xb в b: print xb.bidtext. Вывод: ничего.   -  person Nikhil S    schedule 24.08.2011


Ответы (1)


Хорошо, я обнаружил, что делаю не так. В моем bulkloader.yaml я ссылался на объекты как на модели, а не как на вид.

Однажды я использовал

- kind: Home

вместо того

- model: models.Home

Также я использовал key_is_id = True для обеих ссылок внешнего ключа, чтобы решить проблему поиска родительских и дочерних данных.

Вот как я получаю доступ к своим родительским и дочерним данным

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

Надеюсь, это поможет некоторым новичкам вроде меня, потому что я потратил на это много времени. Спасибо всем, кто нашел время, чтобы ответить в этой ветке.

person Nikhil S    schedule 26.08.2011
comment
Добавьте, теперь это тоже работает для x в h.biddings: print x.bidtext - person Nikhil S; 26.08.2011