Проведя некоторые исследования и тесты, я в итоге создал класс.
class RandomIDKey(models.Model):
id = models.IntegerField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name='ID',
unique=True,
db_index=True,
editable=False
)
def save(self, *args, **kwargs):
if not self.id:
self.id = genkey(type(self))
super().save(*args, **kwargs)
class Meta:
abstract = True
с публичной функцией:
def genkey(model):
generated_key = random.randrange(1, 2147483648)
if model.objects.filter(pk=generated_key).exists():
generated_key = genkey(model)
return generated_key
Использование AutoField - плохая идея, поскольку поле не генерируется автоматически базой данных, следовательно, IntegerField