2012-05-17 20 views
6

私はdjangoユーザーにいくつかの追加フィールドを追加する必要があります。私はそこに2種類の方法ForeignKeyとOneToOneフィールドdjan​​go

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    #other fields 

OR

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields 

が、彼らは同じではありません見つかりましたか?同期した後、私はmysqlデータベースに違いがないことを見た

答えて

5

いいえ、どう思いますか? ForeignKeyは1対多の関係です。つまり、ユーザーは多数のプロファイルを持つことができます。 OneToOneは、名前が暗示しているように、一対一の関係です。ユーザーはプロファイルを1つしか持てない可能性が高くなります。

+0

これらを同期させた後、私はmysqlデータベースに差異がないことを知りました。それはどのように区別されているのかを尋ねていました – sumit

+8

データベースの唯一の違い*は、1対1でのカラムのユニーク制約です。実際、 'OneToOneField'は単に' ForeignKey(unique = True) 'です。 –

+1

syncdbはテーブルが定義されてもテーブルを変更しないので、テーブルを削除して再作成する必要があるため、データベースに違いはありません。しかし、あなたは 'sqlall'を使ってさまざまな出力を表示することができます - クリスが言うように、OneToOneには一意の制約があります。 –

4

@Daniel Roseman氏によると、これらは2種類のrdbms関係です。

与えられたユーザーに対して複数のプロファイル を(間違っていると思われる)状況で区別していることがわかります。この状況では、myuser.get_profile()は をMultipleObjectsReturned例外を発生させますが、本質的にはフードの下でget()というクエリを実行しているためです。

+0

+1良い点。技術的にはForeignKeyを使用することができますが、それを適切な一対一として設定すると、複数のプロファイルを作成しようとすると例外が発生することがあります。 –

+0

@ChrisPrattはい。基本的には、ForeignKeyでそれを行う場合、あなたは拡張モジュールを 'UserProfile'以外の名前にすることにより、djangoの仕様(get_profileを無用にレンダリングするので)からずっと離れてしまいます。 – rantanplan

関連する問題