2017-06-17 15 views
1

TrainingモデルとDrillモデルは、お互いにManyToMany関係を持っています。私が抱えている問題は、デフォルトでDjangoが一意性を強制し、同一のTrainingに重複ドリルを持つことはできません。Django RestフレームワークWith ManyToManyフィールドwith

これを解決するにはManyToMany関係を設定するときにthrough=パラメータを使用できますが、これはDjango Rest Frameworkで多くの問題を引き起こします。

他の方法はありますか?私はM2Mリレーションシップで一意性を強制しないためにthrough=モデルを作成する必要がありますか?

私がDRFで持っている問題は、作成された新しいモデルのための中間シリアライザが必要であることです。これは、Drillのデータを送信したいときに問題を引き起こします。なぜなら、それはのデータをすべて破棄します。これは、必要なカスタムシリアライザのためにTrainingDrill(中間モデル)が必要であるためです。

この小さな変更は、実際には非常に多くの追加の変更が必要です。より良い方法が必要です。

答えて

0

はモデルを通じてに関するご質問にお答えするには:通常、(多対多の関係にさらなる情報を追加するために使用されているモデルを通じ

例えば、あなたは、いくつかのソート順を追加、または関係とデートするために必要な場合私はあなたがそのアイデアを得ると確信しています)。

は一意性を達成するために=を通じて使用しないでください。一意性を避けるために、このルートを下って行くに関しては

を、私はそれについて考えての正しい方法だとは思いません。 Djangoの自身の例にhere 基づいて、あなたはM2M関係に複数回、同じインスタンスを追加できることがわかります:

>>> a2 = Article(headline='NASA uses Python') 
>>> a2.save() 
>>> a2.publications.add(p1, p2) 
>>> a2.publications.add(p3) 
Adding a second time is OK: 
>>> a2.publications.add(p3) 

多対多の関係は、いずれかの側にキャストすることができます(通常は両方ではありません)

class Drill(models.Model): 
    training = models.ManyToManyField(Training) 
    anotherfield = models.CharField('some other field description', max_length = 128) 

class Training(models.Model) 
    yetAnotherField = models.CharField('yet another field description', max_length = 128) 

が、これは

のホープ:、ここでそれを行うための一つの方法です
関連する問題