2013-03-31 5 views
6

以下のようにdjango 1.5ユーザーモデルを拡張しました。データベースに行を挿入すると問題が発生します。私のmodels.pyファイルは以下のようになります。djangoのカスタムユーザーモデル1.5

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年、 '子行を追加または更新できません:。外部キー制約が失敗する(csiopdjango_admin_log、CONSTRAINT user_id_refs_id_c8665aa FOREIGN KEY(user_idauth_userid)を参照)を')

だから、それは次のようになりますdjango_admin_logテーブルは、常にauth_userモデルへの外部キー参照を必要とします。しかし、私は顧客のユーザーモデルを作成したので、スーパーユーザーを作成すると、ユーザーの詳細は顧客のMyUserテーブルにのみ保存され、auth_userモデルにはエントリが作成されません。

この問題を解決するにはどうすればよいですか?提案してください。

おかげ スリーカンス

+0

設定で 'AUTH_USER_MODEL'を設定しましたか? https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model – Ngenator

+0

はい。カスタムMyUserを指すようにAUTH_USER_MODELを設定しました。 – Dev

答えて

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 Userモデルを参照している他のテーブルがある場合は、他の場所で同じ種類の問題に再実行されます。

4

同じ問題が発生しました。 DjangoはデフォルトのDjangoユーザモデルを独自のカスタムモデルに置き換えると、使用されなくなった古い依存関係をデータベースから削除することはありません。実際には、 "auth_user"テーブルに外部キー制約を持つ "auth_ *"テーブルがいくつかあります。

新しい認証モデルに切り替えたら、「auth_ *」と「django_admin_log」のいずれのテーブルにも必要なデータがないことを確認してからドロップし、「manage.py syncdb」を再実行してください。 。 auth_userテーブルがもう使用されなくなり、厄介な制約がなくなるので、auth_userテーブルが再作成されないことに気づくでしょう。

関連する問題