2010-12-12 19 views
0

私はこの問題を数時間苦労しています。私が見落としている簡単な解決策があるかもしれません。htmlテンプレートとのモデル関係

私は自分のモデルと1対1の関係を持っています。

関連オブジェクトの行を持つ1つのオブジェクトのすべての行を返す必要があります。私はこれらの罰金のすべてを介して実行することができますが、私は戻ってHTMLテンプレートにこれらを送りたいとき、私は問題が発生した - 今すぐ

object 
object 
    object_relationship.property 
    object_relationship.property 
object 
    object_relationship.property 
object 

:ある意味で

は、私はこれを持っています。

オブジェクトを返信することはできますが、上記の順序でobject_relationshipを返信するにはどうすればよいですか?

これは意味がありますか?

答えて

0

私が最初に提案したのは、そのような多くのレポートを行うつもりなら、データを非正規化することです。たとえば、エンティティにobject.nameを含めることができます。

data = [] 
for entity in your_query: 
    children = [{'name': child.name} for child in entity.object_relation] 
    data.append({'name': object.name, 
       'children': children, 
       ... 
       }) 

次に、あなたのテンプレートにdataリストを渡し、それを処理する:あなたはので、多分のようなものは、あなたのテンプレートにdictsのリストを送信することができ、言っ

非常に悪いことに注意してください。 の別のクエリが、すべての最初のクエリの項目の1つを実行します。アプリをプロファイルするにはAppstatsを使用してください。

+0

ありがとうロバート - それはトリックでした - 私はパフォーマンスに同意し、私たちはすぐにこれを非正規化する必要があります。 – sampyxis

2

あなたはこれらのモデルを見て... acutally、これについてあまり心配する必要はないかもしれません。このような場合には

class Venue(base.NamedEntity, HasPerformances, HasUrl, HasLocation): 
    city = db.ReferenceProperty(City, collection_name='venues') 
    url = db.StringProperty(required=True, validator=validators.validate_url) 
    location = db.GeoPtProperty() 

class Performance(base.Entity): 
    show = db.ReferenceProperty(Show, collection_name='performances', required=True) 
    utc_date_time = db.DateTimeProperty(required=True) 
    venue = db.ReferenceProperty(Venue, collection_name='performances', required=True) 

を、何もコードまたはテンプレートのいずれかからvenue.performancesを使用して処理することからあなたを停止しませんリストとして。 APIは、実際のオブジェクトを取得するために必要に応じて自動的にクエリを起動します。同じことがperformance.venueになります。

ここで問題となるのはパフォーマンスです。n+1 problemのバリアントがあります。しかし、Nick Johnsonによるthis articleのような回避策があります。私はAPIコードも読んでみることをお勧めします...それは、プロパティがどのように取得され、逆参照されるのかを面白く読んでいます。