2011-03-23 5 views
0

OKタイトルは本当に混乱しているようですが、実際はとてもシンプルです。これを考えてみましょう:Djangoモデルクラス(m2m)を2レベル上に伸ばしてみよう

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A) 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 

ですから、私はAのすべてのインスタンスを他のフィールドで拡張したいと考えています。例えば、Bを介して利用可能なAのすべてのインスタンスについて、それに関連付けられた整数が必要です。

これを行う簡単な方法はありますか?

EDIT:

私はそれが理にかなっている場合は、1つは、BにおけるCからAのインスタンスに1対多の関係の定義としてこれを見ることができると思います...

+0

(あなたは言及しなかった)にもかかわらずCについての質問をしていると思うのインスタンスAがでB&Cに取り付けることができます同じ時間ですか? – manji

+0

本当にそうではなく、それが私がこの問題を抱えている理由です...これはモデルの単純化されたバージョンです。実際には、私はクラスBにはるかに多くの外部キー(ほとんど1対多)があります。したがって、Bはプロファイル定義のようなすべてのコレクションポイントの一種です。これらすべての外部キーの中では、このように拡張する必要があるのは唯一のものです。 – rytis

答えて

0

あなたの場合Aのすべてのインスタンスを別のフィールドで拡張し、別のフィールドを追加する必要があります。

すべてのA〜Bのフィールドを必要とするシナリオでは、スルーモデルを使用します。あなたの質問のタイトル

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A, through='B_A') 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 


class B_A(models.Model): 
    """ 
    Custom through model for B.a_elements 
    """ 
    a = models.ForeignKey(A) 
    b = models.ForeignKey(B) 
    integer = models.IntegerField() 


b = B.objects.latest('id') 
ab_elements = B_A.objects.filter(b=b).select_related() 
# these are your m2m intermediary model instances, 
# which are essentially A instances with an extra field. 

for ab in ab_elemements: 
    print ab.a # a element 
    print ab.integer # integer associated with this a element. 

、私はあなたが

+0

ご質問が混乱している場合は、私はちょうどそれを策定するのに苦労しました。しかし、はい、それはC.Bについては余分な情報を追加する必要はありません、それはこの余分な情報が必要なCです。 – rytis

+0

C-B-Aデータを分離したいのであれば、Cは珍しいことですか?各C - Aインスタンス間にデータが必要な場合は、C - Aの別のm2mフィールド、 'b.a_elements.all()' idsとその関連値を格納する正規化フィールド、または ' B.a_elements.through' –

+0

はい、そのようなものですが、これをDjangoに伝える方法はありません...私が思いついた解決策は、クラスD、この余分なフィールドがあり、次にCIからですCが開始されたときに自動的に作成されたこの新しいクラスD.クラスDインスタンスには1対多が使用されます(その時点で必要な数がわかっています)。欠点は、私が(簡単に)すべての関連するDインスタンスを見ることができないということです。 – rytis

関連する問題