2015-08-28 5 views
0

При настройке структуры моей базы данных я был настолько глуп, чтобы установить для класса Student поле «student_id» как «primary_key = True». Я понял намного позже, что есть (редкие) случаи, когда необходимо изменить сказанное «student_id». Когда вы делаете это через форму, Django автоматически дублирует ученика, чего я не хочу.Изменение поля первичного ключа в уникальное поле

Я хотел бы изменить «primary_key = True» на «unique = True», и мне интересно, как это сделать.

Мой текущий план, чтобы добавить поле под названием «идентификатор» в классе Student, применять миграции, и идти в оболочку и просто присвоить ему беговую номер с цикл:

counter = 0 
for s in Student.objects.all(): 
    counter += 1 
    s.id = counter 
    s.save() 

Затем я вернусь к моим models.py и измените строку «primary_key = True» на «unique = True». Как я могу убедиться, что Django обрабатывает поле «id», как это было бы с классами без первичного ключа (т.е. автоматически присваивать новый идентификатор, когда новый студент добавляется в базу данных)?

+0

позволяет увидеть вашу модель –

+0

Модель довольно проста: у нее есть поле под названием «student_id» с «primary_key = True» и множество других, не очень релевантных полей - last_name, first_name, study_since и т. Д. – Tobi

+0

Я думаю, вам понадобится переименование-> миграция-> переименование-> цикл миграции для достижения этого –

ответ

0

Это не надежное руководство, но, надеюсь, оно укажет вам в правильном направлении.

При добавлении поля id используйте AutoField вместо IntegerField. AutoField позаботится об увеличении при добавлении новых объектов.

Как только поле было создано и заселено, вы можете установить primary_key=True и удалить его с student_id.

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

+0

И мне нужно будет установить новые идентификаторы вручную в текущей версии (как я предложил в вопросе)? – Tobi

+0

Я не уверен, но я бы так и ожидал. – Alasdair