我有一个名为UserProfile的模型,它存储有关django用户的其他数据 .

这个模型有一个OneToOneField到django.contrib.auth.models.User

我还在User的初始插入时触发的User对象上有一个post保存信号,该用户创建一个链接到该User的UserProfile对象:

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

用户对象可以通过网站前端创建,保存后创建UserProfile . 一切正常 .

我还有一个admin.py文件,允许通过管理控制台创建User和UserProfile对象:

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from myproject.apps.users.models import UserProfile

admin.site.unregister(User)


class UserProfileInline(admin.StackedInline):
    model = UserProfile
    filter_horizontal = ['companies']
    exclude = [
        'field_1', field_n'
    ]


class UserProfileAdmin(UserAdmin):
    inlines = [UserProfileInline]

admin.site.register(User, UserProfileAdmin)

通过管理控制台创建新用户时,UserProfile表单将显示在“用户”表单下方 . 如果我将所有UserProfile字段保留为默认值(即不在表单字段中输入任何数据或更改任何默认值),则使用UserProfile成功创建用户 . 但是,如果我尝试添加任何值或更新UserProfile表单中的任何默认值,则会出现错误:

IntegrityError at /admin/auth/user/add/

duplicate key value violates unique constraint "users_userprofile_user_id_key"
DETAIL:  Key (user_id)=(6323) already exists.

这表示User对象上的post_save信号已被调用两次,两次将已传递到信号中的已创建标志设置为True,导致尝试使用相同的用户ID插入两次UserProfile对象 . Django最终回滚事务,并且没有插入User或UserProfile对象 .

如果我完全删除了post_save信号,那么在管理控制台中一切正常,并且django似乎神奇地为我创建了UserProfile对象,甚至没有(显然)了解它 . 显然,这会打破前端,因为它依赖于这个post_save信号来创建UserProfile对象 .

我正在使用PostgreSQL运行Django 1.6 .

任何关于这种情况的消息都将受到极大的赞赏 . 否则,我认为必须考虑另一种如何在管理控制台中管理UserProfile的方法 .