Создание двух таблиц с неповторяющимися между собой id primary_key в DJANGO ORM

Необходимо создать две таблицы у которых не будут совпадать id в поле primary_key. Например, в таблицу1 мы добавляем новый элемент у которого id будет = 1. Затем в таблицу2 добавляем элемент у которго id будет продолженим последовательности и равен 2. Прочитал, что для этого в SQL есть объект CREATE SEQUENCE, но я не нашёл как можно применить его в Django ORM. Есть ли возможность осущитвить подобную механику в Django?


Ответы (3 шт):

Автор решения: Za Ars

Есть пара вариантов

  1. Унаследовать 2 эти модели от общей НЕ АБСТРАТНОЙ модели. В итоге это будут 3 таблицы, Они будут ссылаться на объекты основной модели, и эти ключи будут уникальными (не сам id)

  2. Использовать GUID. В Django есть UUIDField, для ключа можно использовать его, вероятность что ключи совпадут мала.

Других вариантов предложить пока что не могу


import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

Источник

→ Ссылка
Автор решения: Akina

Обычно когда требуется решить такую задачу - общий автоинкремент,- то используется схема с дополнительной таблицей и триггерная логика.

Вот пример реализации подобной логики в MySQL: fiddle. В других СУБД оно реализуется аналогично.

Как отобразить это на Django - вот даже не спрашивайте...


Ну и в принципе неплохим решением может быть разделение значений генерируемых уникальных ключей. Если СУБД поддерживает не-единичный seed, то одна таблица настраивается на генерирование чётных id, другая соответственно на нечётные. Если же не поддерживает, то весь диапазон значений для типа данных делится пополам (или в некоей пропорции, если прогнозируемое количество записей в таблицах серьёзно различается), и одна начинает генерацию с единицы, а другая с рассчитанного значения. Правда, в обоих случаях никакой последовательности значений во времени даже не прогнозируется.

→ Ссылка
Автор решения: leach

Решил свою задачу с помощью библиотеки django-sequences. Она создаёт ещё одну таблицу в БД, в которой будут хранится последовательности. Удобно, что каждой последовательности можно дать своё имя и с помощью метода get_next_value("test_sequences") получать следующее значение последовательности. В описании моделей, я добавил свои поля primary_key и перед сохранением нового объекта в таблицу необходимо присвоить значение последовательности к полю с primary_key.

→ Ссылка