2017-02-21 18 views
0
class A(Model): 
    to_b = ManyToManyField('B', blank=True, through='AtoB') 

class B(Model): 
    to_a = ManyToManyField('A', blank=True, through='AtoB') 

class AtoB(Model): 
    a = ForeignKey('A', on_delete=CASCADE) 
    b = ForeignKey('B', on_delete=CASCADE) 
    usr = ForeignKey(settings.USER, on_delete=CASCADE) 
    # some other fields 

私はdjangoアプリケーションを作っています。
これは私のmodels.pyにあるものとおおよそ同等です
私はそこに追加データを格納する必要があるので、別のモデルを通過するにはAとBの間にm2mの関係が必要です。
問題があります - モデルのインスタンスを私のカスタムビューに保存しようとすると、との関係Bのインスタンスは保存されているかどうかにかかわらず保存されません。 私がhttp://127.0.0.1:8000/adminに行って、のインスタンスを作成しようとすると、Bとの関係を選択するための適切なフィールド(<select multiple>だと思います)が表示されません。
関係が保存されず、/ adminに表示されない理由を教えてもらえますか?m2m関係はdjangoに表示されず保存されません

class Create(CreateView): 
    model = None # A or B 
    template_name = 'something.html' 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     form.save() 
     return HttpResponseRedirect(self.get_success_url()) 

urls.pyに私はこのような追加の引数を指定します:仕事に行くのではありません views.Create.as_view(model=models.A, fields=['to_b'])

+0

してください。 –

+0

完了、お問い合わせください – Rob

答えて

1

ここ
は私がviews.pyに持っているものとほぼ同等のコードです。独自のManytoMany中間テーブルを使用している場合は、オブジェクトを手動で管理して保存する必要があります。 Djangoの組み込み関数を使用することはできません。

Object Aを保存してから、Object Bを保存し、AtoBテーブル(オブジェクトでもあります)に保存します。

a_to_b = AtoB.objects.create(a=object_a, b=object_b, user=self.request.user) 
print(a_to_b) 

[...]あなたは多対多の関係のための中間 モデルを使用している場合は、関連する管理者の 方法の一部が無効になっているので、これらの例のいくつかは」勝ったことに注意してくださいそのような モデルでは動作しません。

https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many/

あなたのエラーは、ここで説明されて:あなたはこの関係を作成しようとするコードの一部を共有https://docs.djangoproject.com/en/1.10/topics/db/models/#intermediary-manytomany

+1

ありがとうございます。 この場合、m2mフィールドを作成することに意味がありますか? 'to_a'と' to_b'フィールドの両方がAtoBモデルに対して単に 'ForeignKey'であることを意味します。 – Rob

+0

ObjectAが 'n' ObjectsB' AND'に関連することを要求する2つのクラス間の接続があった場合、ManyToMany関係を使用します。逆も同様です。ある意味では、ManyToMany関係は別のテーブルのForeinKeyですが、Djangoによって提供される抽象レベルは高く、これらのオブジェクトを管理する方が速く、苦痛も少なくなります。例えば、object_a.to_b_set.add(* QuerySet [])でオブジェクトを一括追加することができます。また、これらのフィールドに 'related_name'を追加して簡単にします。 https://docs.djangoproject.com/en/1.10/ref/models/relations/#django.db.models.fields.related.RelatedManager.add –

関連する問題