我已经扩展了django 1.5用户模型,如下所示,当我将任何行插入数据库时,我遇到了问题。我的models.py文件如下所示。
class MyUserManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=MyUserManager.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
user = self.create_user(email,
password=password
)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='Email address',
max_length=255,
unique=True,
db_index=True,
)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = MyUserManager()
USERNAME_FIELD = 'email'
def get_full_name(self):
# The user is identified by their email address
return self.email
def __unicode__(self):
return self.email
我的admin.py如下所示。
class MyUserAdmin(UserAdmin):
# The forms to add and change user instances
form = UserChangeForm
add_form = UserCreationForm
# The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'is_admin')
list_filter = ('is_admin',)
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Permissions', {'fields': ('is_admin',)}),
('Important dates', {'fields': ('last_login',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'password1', 'password2')}
),
)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ()
// Now register the new UserAdmin...
admin.site.register(MyUser, MyUserAdmin)
// ... and, since we're not using Django's builtin permissions,
// unregister the Group model from admin.
admin.site.unregister(Group)
我在django教程(https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example)
中遵循了上述内容现在我遇到的问题是每当我在管理员中修改任何内容时,我都会收到一条错误消息,说明如下。
(1452,'无法添加或更新子行:外键约束失败(csiop
。django_admin_log
,CONSTRAINT user_id_refs_id_c8665aa
FOREIGN KEY(user_id
)REFERENCES { {1}}(auth_user
))')
因此,看起来django_admin_log表总是需要对auth_user模型的外键引用。但是因为我创建了一个客户用户模型,当我创建一个超级用户时,用户详细信息只存储在客户MyUser表中,并且在auth_user模型中没有创建任何条目,这似乎导致了这个问题。
我该如何解决这个问题?请建议。
由于 斯里卡特
答案 0 :(得分:7)
这看起来非常像(PostgreSQL)数据库错误 - 而不是Django错误。 “auth_user”(仍然)在数据库结构的ForeignKey约束中引用。您的自定义模型(称为“MyUser”)不应存在此类问题。在这种情况下,引用应该类似于“accounts_myuser”或“myappname_myuser”。
我想,您已经更新了现有代码,包括旧数据库。如果您不需要旧的管理日志,只需删除/删除名为“django_admin_log”的表,然后运行“python manage.py syncdb”(或1.7版本的“python manage.py migrate”)让Django重新创建这张桌子从头开始。
但请注意:如果您有其他表引用“旧”Django用户模型,您将在其他位置再次遇到同样的问题。
答案 1 :(得分:4)
我遇到了同样的问题。一旦你为自己的自定义模型更换了默认的Django用户模型,Django就没有做任何事情来清理数据库中不再使用的旧依赖项。实际上有一些“auth_ *”表在“auth_user”表上有外键约束。
切换到新的auth模型后,请确保在“auth_ *”和“django_admin_log”表中没有任何数据,删除它们,然后重新运行“manage.py syncdb”。您会注意到它不会重新创建auth_user表,因为它已不再使用,并且讨厌的约束已经消失。