2016-11-17 4 views
0

私は(PostgreSQLのとの組み合わせ)のpythonでのORMとしてピーウィーを使用していますが、私は自己参照(親子)ピーウィーは、すべての子孫

とテーブルのうち、指定されたidのすべての子孫を照会しようとしていますを取得しますこれを達成する最良の方法は何ですか?

編集:

私はすでにセットアップピーウィーモデルクラス:

class Customer(BaseModel): 
    customerid = PrimaryKeyField() 
    name = CharField(null=False) 
    parentid = ForeignKeyField(db_column='parentid', 
          null=True, 
          rel_model='self', to_field='customerid') 
    customer_type_customertypeid = ForeignKeyField(
     db_column='customer_type_customertypeid', 
     null=False, 
     rel_model=CustomerType, to_field='customertypeid') 

class Meta: 
    db_table = 'customer' 

今、私はidで与えられた顧客のすべての子を照会し、dictの

C1 = dbhandler.Customer.alias() 

try: 
    return [model_to_dict(model) for model in 
     C1.select().where(...)] 
except: 
    return {} 
にそれを変換したいです

しかし、私はCTEを使用せずにこれを達成するクエリを考えることはできません。しかし、ピーニーはCTEのサポートを持っていないので、私はアイデアがありません。 私はpeeweeが実際のSQLクエリを入れることができる.raw(..)関数を持っていることを知りましたが、それはORMを使う利点を破壊するだけです。

+0

最良の方法は、私たちにこれをコード化するように求めるのではなく、そのドキュメントと「はじめに」を参照することです。私は決してあなたを怒らせようとしているわけではありません。ユーザーが何も試していない、または試したことを私たちに示すことができないところで、これらのことが頻繁にポップアップするだけです。つまり、ソリューション全体をコード化する以外は、実際のコードはありません(これは、あなたが私たちに求めているとは思わないかもしれませんが、あなたが私たちに求めているものです)。これを解決しようと努力してみてください。[最小限の動作例](http://stackoverflow.com/help/mcve)。ようこそ! – Torxed

+0

@Torxed私はいくつかの実際のコードを追加しました – TimoTJ

+0

はるかに良い、近い投票が後退しました。これは、Peeweeをよりよく理解している人が(新しい傾向であると思われる)誰かが助けてくれる、正当で良い質問のようです。運が良かった! – Torxed

答えて

0

おそらく、再帰的な共通テーブル式を実行したいと思うでしょう。 Peewee 2.xはこれをまだサポートしていませんが、3.0に入っていますが、現在リリースされていません。多くの変更があり、APIの一部を完成させていません。ごめんなさい!それを手に入れようとしています。

とにかく、MyModel.raw( 'WITH ...')を使用して再帰CTEを実行し、モデルインスタンスを受け取ることができます。

+0

新しいリリースの機能となることを嬉しく思っています。 – TimoTJ

0

私はあなたが達成しようとしているクエリを完全に理解していませんが、外来キーの循環依存性を持つモデルを定義しているように見えます。ドキュメントにはそのことについて何か言われています Circular Foreign Key Dependencies。オブジェクト間の関係を処理する中間テーブルを作成することをお勧めします。これにより、クエリをより簡単に定義できるようになります。

Peeweeでは、model_to_dictメソッドを使用するのではなく、クエリオブジェクトではなく直接dictオブジェクトを返すこともできます。

C1.select(...).where(...).dicts() 
+0

これは循環外部キーではなく、親子です。 Circularでは、2つのモデルが必要です。 – coleifer

+0

実際には親子関係です。しかし、dictオブジェクトを直接返すことについてのヒントについては、ありがとう! – TimoTJ

関連する問題