我创建了一个“轮廓”模型(具有1对1的关系到用户模型)作为上述扩展现有用户模型 。 轮廓模型有一个可选的多到一个关系到另一种模式:
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
用户创建过程中的管理,这个account
将在新的设置profile
模型之后。 如果没有,该字段为null.
环境:Django的1.5,Python 2.7版
相关的问题:
- 创建扩展的用户简档 (类似的症状,但原因被证明是不同的一个)