Создание объекта Django и Последовательности Пост-ГРЭС

У меня есть сценарий импорта, который выполняет ряд команд для получения вещей от одной Пост-ГРЭС DB другому, оба выполнения той же кодовой базы Django. По большей части это использует./manage.py loaddata для копирования, но некоторые объекты требуют дополнительной обработки, и я использую objects.create Django () метод в пользовательском сценарии для копирования данных. При выполнении этого я указываю идентификатор, т.е.,

MyObject.objects.create(id = 2, title = 'foo')

После того как сценарий сделан, я замечаю, что ПОСЛЕДОВАТЕЛЬНОСТЬ Пост-ГРЭС является неправильной в таблицах, где я сделал objects.create (). Т.е. это было 50 перед импортом, и все еще 50 после, даже при том, что таблица теперь имеет 150 объектов. Это, конечно, приводит к ошибкам при создании новых объектов, так как это пытается использовать идентификатор, который уже существует (На всех этих таблицах, идентификатор является просто ванильным автоинкрементным полем). Однако таблицы, которые были заполнены через./manage.py loaddata, кажутся прекрасными.

Я знаю, что могу вручную сбросить эти таблицы с./manage.py Django sqlsequenreset, но мне любопытно относительно того, почему последовательность, кажется, добирается в неисправном состоянии во-первых. objects.create () не увеличивают его? Я пропускаю что-то очевидное?

6
задан Milen A. Radev 18 January 2010 в 19:06
поделиться

2 ответа

Все работает нормально. Create () Django () не имеет ничего общего с разделением последовательности напрямую. Кратко:

  • PostgreSQL Auto Usenting («Серийный» тип) - это просто ярлык «Создать последовательность + создать целое число поле со значением последовательности как по умолчанию "
  • Первичный ключ autofield django (ID Целое число, если вы не указаны на вас) просто создает последовательное поле
  • , когда вы указываете идентификатор вручную, Postgres вставляет значение в база данных. Когда вы указываете значение, опускает параметр «по умолчанию», который является правильным поведением.

Итак, если вы хотите, чтобы ваши вставки увеличивали последовательность в соответствии с вашим выбором, вам необходимо вручную изменить значение последовательности, используя выбор SetVal («Sequence_Name», INT_VALUE); В противном случае оставьте его NULL, и он автоматически увеличится - выберите ток VAL и увеличивайте его +1 (если не указано по-разному в определении последовательности).

Другая идея заключается в том, что вы создаете объект, а затем обновляете идентификатор (конечно, его нельзя использовать) и в конце установить значение последовательности к идентификатору MAX.

12
ответ дан 8 December 2019 в 17:21
поделиться

Поля автонастройки работает, но YO должен сделать запрос в виде

MyObject.objects.create(title='foo')

Без идентификационного поля это autoCalculated с базой данных.

2
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: