为Django模型设置一个长度为5个字符的唯一字段的正确方法是什么?

时间:2017-05-26 17:32:39

标签: python django django-models

我想要做的是对于我的每个模型对象,都会有一个独特的标签。此标签将是一个由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或其他东西,因为标签需要简短易读。感谢。

1 个答案:

答案 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