2016-07-28 10 views
0

新しいユーザープロファイルモデルをプロジェクトに追加しました。django:既存のユーザーのユーザープロファイルを自動的に作成する

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

    def __unicode__(self): 
     return u'Profile of user: %s' % (self.user.username) 

    class Meta: 
     managed = True 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     profile, created = UserProfile.objects.get_or_create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

上記のコードは、作成された新しいユーザーごとにユーザープロファイルを作成します。

既存のユーザーごとにユーザープロファイルを作成する方法

おかげで、あなたのコードに対応して

答えて

3

あなたは、既存のユーザーをループができ、get_or_create()を呼び出す:

for user in User.objects.all(): 
    UserProfile.objects.get_or_create(user=user) 

ご希望の場合はdata migrationでこれを置くことができ、またはシェルでコードを実行します。

+0

データ移行でどのように行うのですか? – BAE

+1

ドキュメントデータの移行方法を説明するためにリンクしたドキュメントです。 – Alasdair

-2

私は、ユーザーのpost_initリスナーにもget_or_createを置くことを言いますよ。

この「すべてのフィールドがヌルです」というプロファイルは単なる速い例です。プロファイルを持たないすべてのユーザーを設定ページにリダイレクトするミドルウェアを追加すると、追加のデータを入力するよう求められます。 (実際にはこれをやりたければ、現実世界の誰も既存のプロファイルに新しいデータを追加することはありません:))

+0

何を読みましたか? – Nrzonline

0

既存のユーザーの場合、そうでない場合は1を作成します。

def post_save_create_or_update_profile(sender,**kwargs): 
    from user_profiles.utils import create_profile_for_new_user 
    if sender==User and kwargs['instance'].is_authenticate(): 
     profile=None 
     if not kwargs['created']: 
      try: 
       profile=kwargs['instance'].get_profile() 
       if len(sync_profile_field(kwargs['instance'],profile)): 
        profile.save() 
      execpt ObjectDoesNotExist: 
       pass 
     if not profile: 
      profile=created_profile_for_new_user(kwargs['instance']) 
    if not kwargs['created'] and sender==get_user_profile_model(): 
     kwargs['instance'].user.save() 

信号の使用を接続する:

post_save.connect(post_save_create_or_update_profile) 
関連する問題