Мне нужна модель с полем со случайным, уникальным по размеру ключом.Мы собираемся использовать это для человека, чтобы объединить его в мозг и вызвать данные.
Что у меня есть:
def make_code():
numbers = "".join(random.choice(string.digits) for x in range(4))
letters = "".join(random.choice(string.ascii_lowercase) for x in range(2))
return numbers + letters
class PinRecord(models.Model):
pin = models.CharField(max_length=16, primary_key=True)
data = models.TextField(blank=False, null=False)
created = models.DateTimeField(auto_now_add=True)
@classmethod
def create_uniq(cls, action, data):
created = False
while not created:
pin, created = cls.objects.get_or_create(pin=make_code(), defaults={'data':data})
return pin.pin
Есть ли лучший способ сделать create_uniq?
В настоящее время существует небольшая вероятность того, что он зациклится в течение длительного времени, особенно если PinRecords не очищен должным образом или трафик выше ожидаемого.Альтернативная версия, которая ограничивает попытки конечным числом, оставляет нам нечего дать пользователю, кроме ошибки среднего пальца.
Рекомендуемое решение проблемы Случайного, уникального ключа, похоже, uuid, но пользователи будут возражать против записи и повторного ввода uuid.