この記事のコメントからわかるように、それはまだ議論の余地がありますが、何が最善の方法なのですか。
サブクラス化してみましたが、多くの問題が発生しましたが、using profilesは完全に機能します。 IRCUserを作成
class IRCUser(models.Model):
user = models.ForeignKey(User, unique=True)
name = models.CharField(max_length=100, blank= True, null = True)
friends = models.ManyToManyField("IRCUser", blank= True, null = True)
dataRecieved= models.BooleanField(default=False)
は、次のように機能します。
>>> IRCUser(user = User.objects.get(username='Kermit')).save()
EDITを:なぜuser_profilesはエレガントです:
我々はマルチとして動作しますWebアプリケーションを、書いている、のと仮定しましょうプロトコルチャット。ユーザーはICQ、MSN、Jabber、FaceBook、Googleトークなどのアカウントを提供できます.....
すべての追加情報を保持するカスタムユーザークラスを継承によって自由に作成できます。
class CustomUser(User):
irc_username = models.CharField(blank=True, null=True)
irc_password = models.PasswordField(blank=True, null=True)
msn_username = models.CharField(blank=True, null=True)
msn_password = models.PasswordField(blank=True, null=True)
fb_username = models.CharField(blank=True, null=True)
fb_password = models.PasswordField(blank=True, null=True)
gt_username = models.CharField(blank=True, null=True)
gt_password = models.PasswordField(blank=True, null=True)
....
....
、これはより多くの1つのアカウントを持っているために、ゼロ値の多く
トリッキー何-のif-then検証
不可能で
それでは、user_profilesでやりましょう
class IRCProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='ircprofile')
username = models.CharField()
password = models.PasswordField()
class MSNProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='msnprofile')
username = models.CharField()
password = models.PasswordField()
class FBProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='fbprofile')
username = models.CharField()
password = models.PasswordField()
結果:
- はDBはゼロ値
によってフラッディングされていない必要なときに作成することができる
- User_profiles
- 同じタイプのNプロファイルは、一人のユーザ
に割り当てることができ
- バリデーションは容易です
この可能性がありますテンプレート内にもっと秘密の構文がありますが、views/template_tagsにいくつかのショートカットを付けたり、好きなように{% with ... %}
を使用したりすることは自由です。
これは私が必要としていたものです。 – shanyu
これは「Pythonでオブジェクトの継承から期待される動作を反映していません」ということは本当ですが、実装されているのは実際には良い理由があります。パッチを作成しようとした場合、 :-)私はあなたの望む動作がオブジェクトを自動的に "リーフ"サブクラスにすると仮定します。問題は、高価な複数のクエリが必要な大規模な継承ツリーの問題です。または、親モデルに型情報を格納する必要がありますが、親モデルを変更することで継承のための多くのユースケースが削除されます。 –
質問のための良い追加情報、Carl。別の質問のContentTypesフレームワークに基づいて、あなたの回答の1つにリンクを追加しました。 –