Py学习  »  Django

在django中如何生成6位字符串作为主键

Hemant Prajapat • 5 年前 • 1843 次点击  

大家好,我创建一个电子商务网站,我想创建一个独特的参考代码为所有用户的,所以我可以添加一个参考代码列作为一个 primery key 在django中,我想创建一个类似于6位strinf的引用代码 SHIKDC .

请告诉我如何创建一个6位的字符串列作为一个 primary_key 在Django。

我知道如何创建一个6位随机字符串,但我想为所有用户创建一个唯一的6位随机密钥,所以请告诉我如何添加此引用代码列。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43999
 
1843 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Ishwar Jangid
Reply   •   1 楼
Ishwar Jangid    6 年前

在你的模型中使用信号。对于创建的每个实例,都可以这样做。

def pre_save_create_order_id(sender, instance, *args, **kwargs):
    if not instance.order_id:
        instance.order_id = unique_order_id_generator(instance)


pre_save.connect(pre_save_create_order_id, sender=Order)



def random_string_generator(size = 10, chars = string.ascii_lowercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))



def unique_order_id_generator(instance):
    new_id = random_string_generator()
    k = instance.__class__
    q = k.objects.filter(order_id = new_id).exists()
    if q:
        return unique_order_id_generator(instance)
    return new_id
Shakil
Reply   •   2 楼
Shakil    6 年前

可能的方法之一是 UUIDField link 但是如果你使用这个的默认版本。它将是32位唯一的uuid号。

另一种可能的覆盖方式 save 方法和使用django的helper函数 get_random_string link 生成6位唯一字符串。我必须提到这种类型的uuid的冲突是(52位字母^6),你必须意识到这一点。

from django.utils.crypto import get_random_string

class MyCustomModel(models.Model):
    custom_primary_key = models.CharField(max_length=6, primary_key=True, editable=False, unique=True)

     def save(self, *args, **kwargs):
        if not self.custom_primary_key:
            self.custom_primary_key = get_random_string(6)
        return super(MyCustomModel, self).save(*args, **kwargs)