6

オブジェクトの作成時にDjangoシグナル(post_saveまたはなど)を選択的に抑制できるかどうか、あるいは特定のパラメーターを送信できるかどうか疑問に思っています。post_init

私が持っているのはUserオブジェクトです。これは、コード内のさまざまな方法と場所で作成できます。したがって、Profileそれぞれにカスタムオブジェクトを自動的に割り当てるUserために、シグナルを使用しpost_saveます。ただし、ある特定のケースでは、作成されたオブジェクトにバインドしたい追加情報がありProfileます。シグナルへの引数としてそれを渡すことはpost_save素晴らしいことですが、それは可能ではないようです。

もう1つのオプションは、オブジェクトを手動で作成することですが、保存Profile後に作成する必要があります。そうしないと、インスタンスにバインドできません。ただし、インスタンスを保存すると、シグナルによって呼び出される関数を介して別のインスタンスが作成されます。UserProfileUserUserProfile

また、作成したばかりのProfileオブジェクトを取得することはできません'Profile' object is unsubscriptable。エラーが発生するためです。何かアドバイス?

アップデート:

考えられる状況の例を次に示します。

def createUserProfile(sender, instance, created, **kwargs):
if created:  
    profile, created = Profile.objects.get_or_create(user=instance)
    if extra_param:
        profile.extra_param = extra_param
    profile.save()

post_save.connect(createUserProfile, sender=User)

def signup(request):
   ...
   extra_param = 'param'
   user.save()

extra_paramメソッド内の変数をsignupcreateUserProfileメソッドに取得するにはどうすればよいProfileですか?オブジェクトの一部として格納されますか?

4

2 に答える 2

1

なぜこれがうまくいかないのですか?

user = User(...)
user.save()
# profile has been created transparently by post_save event
profile = user.profile
profile.extra_stuff = '...'
profile.save()

イベントに渡すパラメータに夢中になっている場合は、可能ですが悪です。

user = User()
user._evil_extra_args = { ... }
user.save()

In event:
extra_args = getattr(user, '_evil_extra_args', False)

あなたのコードを読む人は、それらの_evil_extra_argsが一体何のためにあるのか、そしてそれがどのように機能するのかわからないので、それは悪いことです。

于 2011-01-28T00:10:55.140 に答える
0

(完全に切断したい場合を除いて)遅延post_saveは不可能ですが、どちらも必要ではありません。プロファイルにパラメータを渡すことはまったく問題ではありません。

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

def create_user_profile(sender, instance, created, other_param=None, **kwargs):  
    if created:  
       profile, created = UserProfile.objects.get_or_create(user=instance)
       profile.other(other_param) # or whatever
       profile.save()

post_save.connect(create_user_profile, sender=User, other_param=p)
于 2011-01-27T14:50:48.433 に答える