Django пытается сохранить объект с существующим первичным ключом - PullRequest
0 голосов
/ 17 июня 2020

Сегодня произошло нечто странное. В основном у меня есть код для импорта данных json в модель, примерно так:

for i in data:
    Signature.objects.get_or_create(**i)

json пример:

[
  {'id': 1, 'plan': 1, 'customer': 1},
  {'id': 2, 'plan': 3, 'customer': 50},
   ...
  {'id': 31, 'plan': 12, 'customer': 22},
   ...
  {'id': 222, 'plan': 12, 'customer': 22},
]

Да, мой клиент не следовал последовательность :( Итак, я импортирую и сохраняю тот же pk.

Этот код работает должным образом, и данные теперь синхронизируются с платежным сервисом (все объекты импортированы).

Теперь странное поведение :

Я использую Django Rest Framework, и после POST (проверьте validated_data) в моем API в этой строке возникает следующая ошибка:

Signature.object.create(**self.validated_data)

повторяющееся значение ключа нарушает уникальное ограничение "plan_signature_pkey" ДЕТАЛИ: Ключ (id) = (1) уже существует.

проверенные данные:

{
   "plan": "3", # This is a foreign key to plan 3
   "payer_only": False,
   "schedule": "09:00",
   "payment: "CREDIT_CARD"
}

Нет 'pk': 1 или ' id ': 1 в проверенных данных

Django пытается создать объект с существующим ключом?

Код отладки, я 31 раз вызвал строку Subscription.create (), затем:

повторяющееся значение ключа нарушает уникальное ограничение "plan_signature_pkey" ДЕТАЛИ: Ключ (id) = (1) уже существует.

....

повторяющееся значение ключа нарушает уникальное ограничение "plan_signature_pkey" ДЕТАЛИ: Ключ (id) = (31) уже существует.

По вызову 32 это работает. Итак, я что-то упускаю? Мне это кажется странным.

1 Ответ

1 голос
/ 18 июня 2020

После долгих поисков я нашел решение. Я использую POSTGRES, а Django использует тип данных PostgreSQL SERIAL для хранения ключей автоинкремента. Назначение первичного ключа вручную останавливает автоматическое увеличение pk. Решение: sqlsequencereset

$ django-admin sqlsequencereset app_label

«Используйте эту команду для генерации SQL, которая исправит случаи, когда последовательность не синхронизирована c с автоматически увеличиваемыми данными поля».

...