django:自动为现有用户创建用户配置文件

django: create user profile for existing users automatically

我今天在我的项目中添加了一个新的 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)

以上代码将为每个新创建的用户创建一个用户配置文件。

但是如何自动为每个现有用户创建用户配置文件?

谢谢

为了响应您的代码,我会说在用户的 post_init 侦听器中也放置一个 get_or_create。

如果此 "all fields null is ok" 配置文件只是一个快速示例,我会放置一个中间件,将所有没有配置文件的用户重定向到设置页面,要求他们填写其他数据。 (可能无论如何你都想这样做,如果不是被迫或游戏化,现实世界中没有人会向他们现有的配置文件添加新数据:))

对于现有用户,它会检查这样的实例是否已经存在,如果不存在则创建一个。

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)

您可以遍历现有用户,并调用get_or_create():

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

如果您愿意,可以将其放在 data migration 中,或者 运行 shell 中的代码。