Как создать Stripe-подобные идентификаторы БД для моделей Django?

Основная проблема, которую я пытаюсь решить: Я хочу, чтобы в моих моделях баз данных были идентификаторы, похожие на идентификаторы Stripe (т.е. в форме aaa_ABCD1234, где ABCD1234 часть - это ULID, а aaa_ часть - это фактически имя таблицы (или его сокращенная версия)). Эта функция сэкономила мне кучу времени при отладке интеграций Stripe, и я бы хотел, чтобы пользователи моих систем могли получить те же преимущества. Однако я знаю, что использование наивного подхода и просто строки в качестве первичного ключа в таблице ужасно сказывается на производительности (в основном индексы и, как следствие, джойны, как я понимаю), поэтому я хочу воспользоваться встроенным в БД типом данных UUID, чтобы хранить в БД только часть ABCD1234 и не хранить часть aaa_, поскольку она будет одинаковой для всех строк в этой таблице.

Где я стою сегодня

В настоящее время я думаю сделать это следующим образом:

  • Иметь "приватное" поле в модели БД (назовем его _db_id?), которое является UUID и технически является первичным ключом модели в БД.
  • Имеем GeneratedField, который берет вышеупомянутое приватное поле и добавляет к нему нужный мне префикс таблицы.

При таком подходе я не могу понять, как заставить Django внутренне при всей его автоматичности использовать сгенерированное поле в качестве "открытого" первичного ключа, но использовать поле _db_id при общении с БД, создании джойнов и т.д.

Есть ли здесь решение, которое я упустил? Есть ли лучший способ сделать это?

Вернуться на верх