2012-03-30 9 views
3

私はこのようになりますDjangoのモデルで働いています:存在しないオブジェクトを作成するOneToOneFieldを作成できますか?

ある
class Subscription(models.Model): 
    user = models.OneToOneField(User) 

は、それはDjangoのauthモジュールからUserクラスと1対1の関連を持っています。この関連付けはオプションではありません。

sub = user.subscription 

DoesNotExist例外がスローされます。ただし、ユーザーがは、このようなコードがあることを意味関連するサブスクリプションを、持っていんれる場合は、一部のレガシーコードとデータベースとのいくつかの手動の工夫のおかげであります。しかし、コードベースの多くは、すべてのユーザが関連するSubscriptionオブジェクトを持っていることを前提としています。

は私が関連付けられているSubscriptionオブジェクトがデータベースに存在しない場合、私は1つを作成し、user.subscriptionが呼び出されたときにそれを返す代わりに、例外をスローするのOneToOneFieldように、そのサブクラスができ方法はありますか?

答えて

1

これを行う正しい方法は、post_saveシグナルをキャッチして、必要に応じてオブジェクトを作成することです。

+0

一度だけデシベルを修正し、あなたのコードをリファクタリングし、ユーザー

  • ためproxy modelを追加'のため、' post_save'シグナルは、関連する 'subscription'オブジェクトの参照を解除する前に必ずしも起動されません。 – mipadi

  • +1

    1つのクエリですべてのレガシーユーザーを処理できます。 –

    0

    あなたは猿 - パッチ適用を行う必要があり、そのために、より良い選択肢があなたのコードをリファクタリングし、サブスクリプション

  • を取得するには、ユーティリティ機能を追加し

    1. あり、subscriptionという名前のプロパティを追加し、getterに必要な基準を作成しますこれは主に、レガシー(既存) `ユーザのために起こる
  • 関連する問題