Вот что я в итоге сделал. Я сделал абстрактную модель. Мой вариант использования для этого требует нескольких моделей, которые генерируют свои собственные, случайные слагы.
Слизень выглядит как AA##AA
, так что это 52x52x10x10x52x52 = 731,161,600
комбинаций. Возможно, в тысячу раз больше, чем мне понадобится, и если это когда-нибудь станет проблемой, я могу добавить письмо в 52 раза больше комбинаций.
Использование аргумента default
не приведет к его сокращению, поскольку абстрактная модель должна проверять наличие столкновений слагов на дочернем элементе. Наследование было самым простым, возможно, единственным способом сделать это.
from django.db import models
from django.contrib.auth.models import User
import string, random
class SluggedModel(models.Model):
slug = models.SlugField(primary_key=True, unique=True, editable=False, blank=True)
def save(self, *args, **kwargs):
while not self.slug:
newslug = ''.join([
random.sample(string.letters, 2),
random.sample(string.digits, 2),
random.sample(string.letters, 2),
])
if not self.objects.filter(pk=newslug).exists():
self.slug = newslug
super().save(*args, **kwargs)
class Meta:
abstract = True