我今天在我的项目中添加了一个新的UserProfile模型。
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)
以上代码将为每个新创建的用户创建用户配置文件。
但如何为每个现有用户自动创建用户个人资料?
由于
答案 0 :(得分:3)
您可以循环浏览现有用户,并致电get_or_create()
:
for user in User.objects.all():
UserProfile.objects.get_or_create(user=user)
如果您愿意,可以将其放在data migration中,或者在shell中运行代码。
答案 1 :(得分: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)
答案 2 :(得分:-2)
在回复您的代码时,我会说将get_or_create也放在用户的post_init监听器中。
如果这个"所有字段为空都没问题"配置文件只是一个快速的示例我将中间件重定向到没有配置文件的所有用户到设置页面,要求他们填写其他数据。 (无论如何,你可能想要这样做,如果不强迫或游戏化,现实世界中没有人会将新数据添加到现有的配置文件中:))