Администратор Django save_model не продвигает первичный ключ в Postgres - PullRequest
2 голосов
/ 22 октября 2019

Итак, у меня есть функция администратора Django, которая позволяет мне создать дубликат MyModel в базе данных:

def save_model(self, request, obj, form, change):
    if '_saveasnew' in request.POST:
        old_obj_id = resolve(request.path).args[0]
        old_obj = MyModel.objects.get(id=old_obj_id)
        obj.other_id = old_obj.other_id
        obj.status = old_obj.status
        obj.project_id = old_obj.project_id
        obj.test_url = old_obj.test_url
        obj.save()
    super(MyModelAdmin, self).save_model(request, obj, form, change)

Это создание работает нормально, но у меня есть другая система, взаимодействующая с этой базой данных, котораявидит ошибки вставки каждый раз, когда вызывается эта функция. Например, если я создаю 2 повторяющихся записи в администраторе Django таким образом, то другая система увидит две ошибки, такие как

Значение дублирующего ключа IntegrityError нарушает уникальное ограничение "my_model_pkey" DETAIL: Key (id)= (1234) уже существует.

Я использую Django 1.11.15 и PostgreSQL 9.5.15.

1 Ответ

0 голосов
/ 01 ноября 2019

Мое лучшее предположение, что где-то ваш код говорит вашей базе данных создать новую строку объекта и явно установить идентификатор этой строки равным X. Когда действительно код должен сообщать вашей базе данных о создании новой строки объекта и неявноустановите идентификатор этой строки равным следующему доступному целому числу.

Ваш код сбивает с толку, потому что вы делаете это очень сложным способом. Почему эта функция принимает и объект, и запрос? И тогда он находит старый объект из запроса? Где был создан новый объект?

Более простым способом было бы сначала проверить, хотите ли вы сохранить как новый. Если нет, то есть функция, которая обновляет объект и присваивает ему существующий объект. Если это запрос «Сохранить как новый», создайте новую строку объекта, которая будет иметь значения, аналогичные значениям существующего объекта (кроме идентификатора). А затем обновите этот новый объект с изменениями. Или, однако, ваша логика должна работать. В любом случае, есть гораздо более простой способ выполнить шаги, которые вы хотите выполнить, если задуматься о порядке шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...