Python Django如何为模型属性自动生成唯一的数字/字符串
所以我一直试图在django模型中生成10位数的唯一随机数,而不将其作为主键。我的模型是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
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