Используйте 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
.