При добавлении db_table в модель добавлено поле last_login - PullRequest
0 голосов
/ 10 июля 2020

Предыстория: я начал проект с пользовательской моделью User. Однако, нуб, я не знал о классе AbstractBaseUser. Так что я просто написал свое. Приложение развернуто и работает нормально. Но теперь я хочу переключиться на использование AbstractBaseUser, чтобы воспользоваться преимуществами некоторых встроенных утилит Django (например, предварительно созданного процесса сброса пароля). Я сделал это с другим приложением, и все работало нормально. Но этого не было, пока я вносил изменения. Поскольку это так, мне нужно было сохранить старую таблицу пользователей, пока я вносил изменения с ее копией. Итак, моим первым шагом было добавление db_table = test_users к моей старой пользовательской модели, чтобы приложение prod работало с неизменной таблицей. Я запустил миграцию, и произошли две неожиданные вещи (я новичок, и поэтому они были неожиданными):

  • Старая таблица пользователей была переименована. Я думал, будет создана новая таблица. Нет проблем, я быстро скопировал новую таблицу и назвал копию именем старой таблицы, чтобы приложение prod могло найти своих пользователей
  • Был добавлен столбец last_login. Зачем?? Вот моя модель с добавленными db_table

    class User(models.Model):
        first_name = models.CharField(max_length=255)
        last_name = models.CharField(max_length=255)
        email = models.CharField(max_length=255)
        password = models.CharField(max_length=255)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        client_id = models.IntegerField(blank=True, null=True)
        is_admin = models.BooleanField(default=False)
        is_super = models.BooleanField(default=False)
        is_active = models.BooleanField(default=True)
    
        class Meta:
            db_table = "test_users"

. Большая проблема в том, что когда я перехожу на AbstractBaseUser и запускаю миграцию, я получаю сообщение об ошибке. Глядя на файл миграции, я вижу, что это изменение создает миграцию, и все, что он пытается сделать, - это добавить last_login в таблицу. Поэтому, конечно, я получаю сообщение об ошибке «Повторяющееся имя столбца 'last_login'»

Итак, у меня двоякий вопрос:

  1. Почему этот столбец был добавлен в первый миграция?
  2. Если я просто запустил migrate --fake и продолжу, будут ли это иметь непредвиденные последствия? Я подумал, что это может быть хорошим решением, учитывая, что файл миграции показывает, что больше ничего не делается, и если поле уже существует, то никакого вреда не будет?

1 Ответ

0 голосов
/ 11 июля 2020

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

...