Ответ 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
.