Generate a Unique String in Python/Django

后端 未结 10 2601
清酒与你
清酒与你 2020-12-15 05:56

What I want is to generate a string(key) of size 5 for my users on my website. More like a BBM PIN.

The key will contain numbers and uppercase English letters:

10条回答
  •  心在旅途
    2020-12-15 06:24

    I have a unique field, named 'systemCode' within a lot of my models. And I am generating this manually, but also sometimes it can take value from user input, so I have to check this value before saving and if it matches , regenerating this value as a unique value.

    And this is how I generate unique strings at this scenario :


    This is my standard class Model :

    class ClassOne(models.Model):
       name = models.CharField(max_length=100)
       systemCode = models.CharField(max_length=25, blank=True, null=True, unique=True)
       ....
    

    I am using save() method to generate and check this systemCode is unique :

        def save(self, *args, **kwargs):
            systemCode = self.systemCode
            if not systemCode:
                systemCode = uuid.uuid4().hex[:6].upper()
            while ClassOne.objects.filter(systemCode=systemCode).exclude(pk=self.pk).exists():
                systemCode = uuid.uuid4().hex[:6].upper()
            self.systemCode = systemCode
            super(ClassOne, self).save(*args, **kwargs)
    

    But I have same systemCode field in all my Models. So I am using a function to generate value.

    So, this is how to generate unique value for all models using saveSystemCode() function :

    import uuid 
    
    def saveSystemCode(inClass, inCode, inPK, prefix):
        systemCode = inCode
        if not systemCode:
            systemCode = uuid.uuid4().hex[:6].upper()
    
        while inClass.objects.filter(systemCode=systemCode).exclude(pk=inPK).exists():
            systemCode = uuid.uuid4().hex[:6].upper()
    
        return systemCode
    
    class ClassOne(models.Model):
        name = models.CharField(max_length=100)
        systemCode = models.CharField(max_length=25, blank=True, null=True, unique=True)
        ....
    
        def save(self, *args, **kwargs):
            self.systemCode = saveSystemCode(ClassOne, self.systemCode, self.pk, 'one_')
            super(ClassOne, self).save(*args, **kwargs)
    
    
    class ClassTwo(models.Model):
        name = models.CharField(max_length=100)
        systemCode = models.CharField(max_length=25, blank=True, null=True, unique=True)
        ....
    
        def save(self, *args, **kwargs):
            self.systemCode = saveSystemCode(ClassTwo, self.systemCode, self.pk, 'two_')
            super(ClassTwo, self).save(*args, **kwargs)
    
    class ClassThree(models.Model):
        name = models.CharField(max_length=100)
        systemCode = models.CharField(max_length=25, blank=True, null=True, unique=True)
        ....
    
        def save(self, *args, **kwargs):
            self.systemCode = saveSystemCode(ClassThree, self.systemCode, self.pk, 'three_')
            super(ClassThree, self).save(*args, **kwargs)
    

    while loop in the 'saveSystemCode' function is preventing to save same value again.

提交回复
热议问题