我创建了一个“配置文件”模型(与用户模型一对一的关系),如扩展现有用户模型中所述。配置文件模型与另一个模型具有可选的多对一关系:
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
account = models.ForeignKey(Account, blank=True, null=True, on_delete=models.SET_NULL)
正如那里记录的那样,我还创建了一个内联管理员:
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'profiles'
# UserAdmin and unregister()/register() calls omitted, they are straight copies from the Django docs
现在,如果我account
在创建用户时没有在管理员中选择一个,则不会创建配置文件模型。因此,我再次按照文档连接到post_save信号:
@receiver(post_save, sender=User)
def create_profile_for_new_user(sender, created, instance, **kwargs):
if created:
profile = Profile(user=instance)
profile.save()
只要我不在管理员中选择一个,这就可以正常工作account
,但如果我这样做,我会得到一个IntegrityError
异常,告诉我duplicate key value violates unique constraint "app_profile_user_id_key" DETAIL: Key (user_id)=(15) already exists.
显然,内联管理员试图自己创建profile
实例,但我的post_save
信号处理程序当时已经创建了它。
如何解决此问题,同时满足以下所有要求?
- 无论新用户是如何创建的,之后总会有一个
profile
模型链接到它。 - 如果用户
account
在创建用户时在 admin 中选择了一个,这account
将在profile
之后在新模型上设置。如果不是,则该字段为null.
环境:Django 1.5,Python 2.7
相关问题:
- 创建扩展的用户配置文件(类似的症状,但原因却是不同的)