Подтвердить что ты не робот

Первичный ключ и уникальный ключ в django

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

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

primary_key=True означает null=False и unique=True.

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

Спасибо.

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

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

Ответ 1

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

Edit:

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

Изменить 2:

Когда вы говорите, что допустимы значения повторяющихся первичных ключей, вы указываете, что происходит то, что обновляется существующая запись с одним и тем же первичным ключом - на самом деле нет двух объектов с одним и тем же основным ключом в базе данных (который может не бывает). Проблема в том, что слой Django ORM выбирает сделать 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.