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 に答える