我想要做的是对于我的每个模型对象,都会有一个独特的标签。此标签将是一个由5个字符组成的随机字符串,由字母和数字组成。始终生成一个独特的可能是一个挑战。现在,我是按照以下方式做的:
class Order(models.Model):
label = models.CharField(max_length=5, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.label or self.label == '' or self.label == None:
label = ''
for i in range(5):
label += random.choice(string.lowercase + string.uppercase + string.digits)
if Order.objects.filter(label=label).exists():
self.save() # Try again
else:
self.label = label
super(Order, self).save(*args, **kwargs)
基本上,save方法生成一个标签,如果标签与现有对象的标签匹配,则重新启动该方法。但是,由于随机性的性质,几乎不可能对此进行测试。这种方式有用吗?或者我以后会遇到问题?
此外,请不要建议使用UUID或其他东西,因为标签需要简短易读。感谢。
答案 0 :(得分:1)
我们在ShortLink模型中为short_id
生成8长度唯一值做类似的事情。
def save(self, *args, **kwargs):
if self.short_id is None:
self.short_id = self._generate_random_shortid()
@classmethod
def _generate_random_shortid(cls):
length = 8
char = string.ascii_uppercase + string.digits + string.ascii_lowercase
# short_id must be unique
while True:
short_id = ''.join(random.choice(char) for x in range(length))
try:
ShortLink.objects.get(short_id=short_id)
except ShortLink.DoesNotExist:
return short_id