Python Django如何为模型属性自动生成唯一的数字/字符串

Python Django如何为模型属性自动生成唯一的数字/字符串,python,django,Python,Django,所以我一直试图在django模型中生成10位数的唯一随机数,而不将其作为主键。我的模型是 Class Transaction(models.Model): Referrence_Number = models.Charfield(max_lenght = 10, blank=True, editable=False, unique=True) 我知道Django内部有一个特殊的特性,可以生成随机字符串,这是我在阅读文档后了解到的 from django.utils.crypto

所以我一直试图在django模型中生成10位数的唯一随机数,而不将其作为主键。我的模型是

Class Transaction(models.Model):
      Referrence_Number = models.Charfield(max_lenght = 10, blank=True, editable=False, unique=True) 
我知道Django内部有一个特殊的特性,可以生成随机字符串,这是我在阅读文档后了解到的

from django.utils.crypto import get_random_string
get_random_string(10).lower()

但我的问题是如何将这个get_random_string函数合并到我的django事务模型中的transaction_number实例中。事实上,我对django还不太熟悉,无法理解

也许您可以覆盖模型上的save()方法。大概是这样的:

def save(self,*args, **kwargs):
    self.Reference_Number = get_random_string(10).lower()
    super(Transaction, self).save(*args, **kwargs)
from utils import create_new_ref_number

Class Transaction(models.Model):
      Referrence_Number = models.Charfield(
           max_length = 10,
           blank=True,
           editable=False,
           unique=True,
           default=create_new_ref_number
      )
import random

def create_new_ref_number():
      return str(random.randint(1000000000, 9999999999))

您可以将属性的默认值设置为生成所需的
reference\u Number
的函数。只是不要在创建记录时设置
reference\u编号

例如,您的模型属性如下所示:

def save(self,*args, **kwargs):
    self.Reference_Number = get_random_string(10).lower()
    super(Transaction, self).save(*args, **kwargs)
from utils import create_new_ref_number

Class Transaction(models.Model):
      Referrence_Number = models.Charfield(
           max_length = 10,
           blank=True,
           editable=False,
           unique=True,
           default=create_new_ref_number
      )
import random

def create_new_ref_number():
      return str(random.randint(1000000000, 9999999999))
在您的
utils.py
文件中,您会有如下内容:

def save(self,*args, **kwargs):
    self.Reference_Number = get_random_string(10).lower()
    super(Transaction, self).save(*args, **kwargs)
from utils import create_new_ref_number

Class Transaction(models.Model):
      Referrence_Number = models.Charfield(
           max_length = 10,
           blank=True,
           editable=False,
           unique=True,
           default=create_new_ref_number
      )
import random

def create_new_ref_number():
      return str(random.randint(1000000000, 9999999999))

虽然您可以简单地在
默认
参数中抛出
randint
函数,但您应该将其抽象掉,这样您就可以执行额外的细节,如验证不存在具有相同id的记录等。

我通常使用uuid,创建对象时uuid字符串将设置为字段

the_field = models.CharField(max_length=36, default=uuid.uuid4)

这将自动创建一个唯一的参考号

import random

class Transaction(models.Model):
    Referrence_Number = models.Charfield(
            max_length = 10,
            blank=True,
            editable=False,
            unique=True,
            default=create_new_ref_number
        )

    def create_new_ref_number():
                not_unique = True
                while not_unique:
                    unique_ref = random.randint(1000000000, 9999999999)
                    if not Transaction.objects.filter(Referrence_Number=unique_ref):
                        not_unique = False
                return str(unique_ref)

有没有理由不使用
get_random_string
作为django文档中讨论的字段的默认值生成器?据我所知,get_random_string生成12作为默认值,我选择了10位数字,这样我就可以对其进行索引,并可以通过引用号搜索对象。在django中,如果create_new_ref_number意外返回以前生成的数字,会发生什么情况。模型是否再次调用默认函数或抛出错误?它也会创建非唯一的数字!并导致错误
CharField
typo错误。您还必须删除create_new_ref_number之后的括号,即:
default=create_new_ref_number,
。否则,在导入模块时将在类定义上调用它,生成一个常量值。@MasoodKhaari-yes