Первичный ключ и уникальный ключ в Django - PullRequest
16 голосов
/ 18 мая 2011

У меня был собственный первичный ключ, который нужно настроить для определенных данных в модели.

Этого было недостаточно, поскольку попытка вставить повторяющийся номер увенчалась успехом.Так что теперь, когда я заменяю primary_key=True на unique=True, он работает должным образом и отклоняет повторяющиеся числа !!.Но согласно этому документу (, который использует поля ).

primary_key=True подразумевает null=False и unique=True.

Что меня смущает: почему он принимает значение в первую очередь при наличии встроенного unique=True?

Спасибо.

Обновленный оператор:

   personName = models.CharField(primary_key=True,max_length=20)

1 Ответ

15 голосов
/ 19 мая 2011

Используйте AutoField вместо primary_key.

Редактировать:

Если вы не используете AutoField, вам придется вручную рассчитать / установить значение для поля первичного ключа.Это довольно громоздко.Есть ли причина, по которой вам нужно ReportNumber к первичному ключу?У вас все еще может быть уникальный номер отчета, по которому вы можете запрашивать отчеты, а также автоматически увеличивающийся первичный ключ целого числа.

Изменить 2:

Когда выДопустим, допустимы повторяющиеся значения первичного ключа, вы указываете, что происходит обновление существующей записи с тем же первичным ключом - на самом деле в базе данных нет двух объектов с одинаковым первичным ключом (чего не может быть).Проблема заключается в том, что слой ORM в Django выбирает UPDATE (изменить существующую запись БД) вместо INSERT INTO (создать новую запись БД).Проверьте эту строку из django.db.models.base.Model.save_base():

if (force_update or (not force_insert and
        manager.using(using).filter(pk=pk_val).exists())):
    # It does already exist, so do an UPDATE.

В частности, этот фрагмент кода:

manager.using(using).filter(pk=pk_val).exists()

Это говорит: «Если запись с таким же первичным ключом, как этот Model существует в базе данных, затем сделайте обновление. "Поэтому, если вы повторно используете первичный ключ, Django предполагает, что вы делаете обновление, и, следовательно, не вызывает исключение или ошибку.


Я думаю, что лучшая идея - позволить Django генерировать первичныйключ для вас, а затем есть отдельное поле (CharField или любое другое), которое имеет ограничение unique.

...