2013-06-28 6 views
5

は、私は2つの私のmodels.pyファイル内のクラスがあります:私の変形例ではDjangoで自動生成されたManyToManyテーブルの冗長IDフィールドを削除するには?

class Person: 
    person_name = models.CharField(max_length = 50) 

class Course: 
    course_name = models.CharField(max_length = 50) 
    course_person = models.ManyToManyField(Person) 

を、一人で多くのコースを取り、1つのコースは、多くの人々、ひいては多対多で使用されています。

Djangoがテーブルを自動生成するようにすると、余分なIDフィールドが得られます。 自動生成されたperson_course manytomanyテーブルを、person_idcourse_idという2つの複合キーで構成したいとします。 :どちらも自動生成され、自動インクリメントされたフィールドです。

また、ManyToManyクラスを定義しようとしましたが、キーワードthrough=を使用してフィールドをリンクしようとしましたが、それは役に立ちませんでした。

私はGoogleに頼んだが、助けを借りずに済んだ。あなたには、いくつかのヒントを提供することができます中で、多くのいくつかの天才:)

答えて

6

あなたの代わりに何ができるか、現在does not support composite primary key by default

Djangoは自動(代理)主キーとしてidを生成しておくと、その後through表にunique_together関係を定義しています。

class Meta: 
    unique_together = (course, person) 

この方法で、あなたはを通してテーブルに一意のエントリを保証することができ、あなたがidを参照するとき、それは我々がとにかく欲しいものである(course, person)ユニークを参照するのと同じです。

必要に応じてこの機能を実装するものがいくつかあります(third party apps)。しかし、(レガシーシステムのサポートのような)絶対的な必要性がなければ、私はそれを単純にしておき、unique_togetherを実装するだけです。

+2

ありがとうございます。さて、Djangoはそれをすることができないという制限があります。 Djangoは人生を楽にしようとします。私は自分のアプリケーションで使用するためにデータベースを一から作成していましたが、私はDjangoがすべてのことを自分自身でやり遂げようとは思っていません。少なくとも、冗長なIDフィールドを作成しないように、私はそれほど多くの制御を持っていません。 MySQLのワークベンチを使用してデータベースを視覚的に表現していますが、この余分なIDフィールドはうまく見えません。とにかく、それはアプリケーションのロジックに影響しないので、私はそれで生きることができます:) – shailenTJ

関連する問題