Изменение primary_key на модель Django AbstractBaseUser

У меня есть этот обычай User модель, в которой я изменил primary_key на email поле вроде так:

class User(AbstractBaseUser, PermissionsMixin):
    # Primary Key of my model 
    email = models.EmailField(max_length=254, primary_key=True)   

    username = models.CharField(_('username'),max_length=30,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[
            RegexValidator(
                r'^[\w.ñ@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers ' 'and @/./+/-/_ characters.')
            ),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )

    first_name = models.CharField(max_length=50,blank=True,         null=True,
    )

    last_name=models.CharField(max_length=50, blank=True,            null=True,)

    is_staff = models.BooleanField(
        default=True,
        help_text='Designates whether the user can log into this admin site.')

    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

У меня также есть другая модель с именем Match:

class Match(models.Model):

    match_date = models.DateTimeField(default=timezone.now, null=True)

    home_team_players_accept = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='home_team_players_accept',
        blank=True,)

    away_team_players_accept = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='away_team_players_accept',
        blank=True,)

    home_team_players_cancel = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='home_team_players_cancel',
        blank=True,)

    away_team_players_cancel = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='away_team_players_cancel',
        blank=True,)

    fichaje_players_match = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='fichaje_players_match',
        blank=True,)

Когда я выполню python manage.py migrate Я получаю этот вывод:

File "/home/bgarcial/.virtualenvs/fuupbol2/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.InternalError: cannot drop constraint auth_user_pkey on table auth_user because other objects depend on it
DETAIL:  constraint auth_user_groups_user_id_6a12ed8b_fk_auth_user_username on table auth_user_groups depends on index auth_user_pkey
constraint auth_user_user_permissio_user_id_a95ead1b_fk_auth_user_username on table auth_user_user_permissions depends on index auth_user_pkey
constraint games_information_match__user_id_246b2ea3_fk_auth_user_username on table games_information_match_away_team_players_cancel depends on index auth_user_pkey
constraint games_information_match__user_id_9d9f8df1_fk_auth_user_username on table games_information_match_home_team_players_cancel depends on index auth_user_pkey
constraint games_information_match__user_id_79122347_fk_auth_user_username on table games_information_match_fichaje_players_match depends on index auth_user_pkey
constraint games_information_match__user_id_54e7681b_fk_auth_user_username on table games_information_match_away_team_players_accept depends on index auth_user_pkey
constraint games_information_match__user_id_14203632_fk_auth_user_username on table games_information_match_home_team_players_accept depends on index auth_user_pkey
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

Я нашел несколько ссылок об этом случае сценария, но я не понимаю, как устранить это неудобство

Переименование первичного ключа завершается неудачно "невозможно удалить ограничение для таблицы, потому что другие объекты зависят от него"

Невозможно удалить пользователей таблицы, потому что другие объекты зависят от нее

Я даже пытался сбросить всю базу данных, но неудобство сохраняется.

1 ответ

Решение

В папке migrations вашего проекта, есть несколько файлов, названных так:

0001_initial.py
0002_auto_ ... .py etc.

эти файлы являются историей миграций вашей базы данных, и, поскольку вы просто удалили свою базу данных, я буду считать, что вам не нужна история миграции.

Поэтому простое решение - очистить migrations папку (удалите все, кроме __init__.py файл), удалите базу данных еще раз и:

python manage.py makemigrations
python manage.py migrate

Удачи:)

Другие вопросы по тегам