2009-07-22 5 views
2

私はdjangoでデータベース関係をモデル化しています。私は他の意見もあります。この関係は、2対多の関係のようなものです。例えば、患者は2人の医師、すなわち出席者と主任者を有することができる。医師には明らかに多くの患者がいる。このデータベース関係をどのようにモデル化しますか?

アプリケーションはどちらがどちらであるかを知る必要があります。さらに、ある患者の主治医が別の患者の主治医である場合がある。最後に、出席者とプライマリの両方がしばしば同じです。

まず、私は患者のテーブルから外科医のテーブルに2つの外来キーを考えていました。しかし、私はdjangoがこれを認めないと思います。さらに、2番目の考えでは、これは実際には多対多の関係です。

したがって、医者のタイプを患者に関連して維持しながら、この関係をdjangoとモデル化するにはどうすればよいですか?おそらく、医師のタイプを多対多関連テーブルに保存する必要がありますか?

おかげで、 ピート

答えて

10

class Patient(models.Model): 
    primary_physician = models.ForeignKey('Physician', related_name='primary_patients') 
    attending_physicial = models.ForeignKey('Physician', related_name='attending_patients') 

これは、あなたが同じモデルに2つの外部キーを持つことができます。 Physicianモデルにはprimary_patientsattending_patientsというフィールドもあります。

+0

うーん、これは面白いです。私は喜んで私が尋ねた。 djangoはrelated_nameをエラーで使用することを提案しました。 – slypete

+1

はい - "related_name"がない場合、医師は "patient_set"逆引き関係を取得するためです。しかし、両方のフィールドが "patient_set"リバースリレーションを作成しようとするため、これによりエラーが発生します。同じモデルに対する外部キーがある場合は、この問題を回避するために「related_name」を指定する必要があります。 – mipadi

+0

これにより、医師の患者リストを取得する際に重複が発生します。アプリケーションは組合を取る必要があります。 – slypete

0

私はあなたの結論に同意します。医師のタイプを多対多のリンクテーブルに保存します。

1

多対多の結合テーブルの使用を検討してください。アプリケーションロジックを使用して、1人の患者につき2人以上の医師を防ぐ。このようなものについてはどのように

Physician 
    Physician_ID 
    ... 

Patient 
    Patient_ID 
    ... 

Physician_Patient 
    Physician_ID int not null 
    Patient_ID int not null 
    Type ENUM ('Primary', 'Attending') 
    PRIMARY KEY (Physician_ID, Patient_ID) 
    KEY (Patient_ID) 
+0

データベースレベルの制約を設定することもできます。あなたのDBMSに依存します。 –

+0

DjangoのORMレイヤーに、結合テーブルを表すモデルがありません。結合表は自動的に作成され、余分な列はそれらに追加できません。概念的には結合表を表すことができるForeignKeyフィールドを持つモデルを作成し、余分なフィールドを追加することはできますが、他のソリューションでは扱いにくいかもしれません。 – mipadi

+0

それは確かです。 http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships私はここでM2M関係を使用する理由は何も見ません。通常の外部キーは問題ありません。 –

関連する問題