我有一个名为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的方法 .