2016-07-28 72 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,或在shell中運行代碼。

+0

如何在數據遷移中做到這一點? – BAE

+1

我鏈接的文檔解釋瞭如何創建數據遷移。 – Alasdair

-2

在回答您的代碼,我會說把一個get_or_create也處於post_init偵聽用戶。

如果這個「各個領域空是確定的」配置文件僅僅是一個快速的例子我把中間件重定向的所有用戶,沒有配置文件的設置頁面,要求他們填寫附加數據。 (可能是您無論如何要做到這一點,沒有人在現實世界將新數據添加到現有的配置文件,如果不是被迫或遊戲化到它:))

+0

我剛剛讀了什麼? – Nrzonline

0

對於現有的用戶,它會檢查這種情況是否已經存在,並創建一個,如果它不。

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) 
相關問題