5

我已经扩展了 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_c8665aaFOREIGN KEY ( user_id) REFERENCES auth_user( id))')

所以,看起来 django_admin_log 表总是需要外键引用到 auth_user 模型。但是因为我创建了一个客户用户模型,所以当我创建一个超级用户时,用户详细信息仅存储在客户 MyUser 表中,并且在 auth_user 模型中没有创建任何条目,这似乎是导致问题的原因。

我该如何解决这个问题?请建议。

谢谢斯里坎特

4

2 回答 2

6

这看起来很像(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 User 模型,您将在其他位置再次遇到同样的问题。

于 2013-04-03T22:44:27.657 回答
4

我遇到了同样的问题。一旦你将默认的 Django 用户模型换成你自己的自定义用户模型,Django 不会做任何事情来清理数据库中不再使用的旧依赖项。实际上有一些“auth_*”表在“auth_user”表上有外键约束。

切换到新的身份验证模型后,确保“auth_*”和“django_admin_log”表中没有您需要的数据,删除它们,然后重新运行“manage.py syncdb”。您会注意到它不会重新创建 auth_user 表,因为它不再使用并且讨厌的约束消失了。

于 2013-04-17T22:15:17.550 回答