Python Django unique random作为默认值

Python Django unique random作为默认值,python,django,Python,Django,在将某个值指定为默认值时,是否有方法检查该值是否存在于模型中?如果赋值存在(它不是唯一的),则生成另一个值。(阅读评论): 也许解决方法不能在唯一_rand内部,而是在个人类内部。 我不想重写save方法,因为在save之前我需要code。另外,我不想使用uuid随机变量。只需测试循环中是否存在生成的代码 from django.contrib.auth.models import User def unique_rand(): while True: code = p

在将某个值指定为默认值时,是否有方法检查该值是否存在于模型中?如果赋值存在(它不是唯一的),则生成另一个值。(阅读评论):

也许解决方法不能在
唯一_rand
内部,而是在
个人
类内部。
我不想重写
save
方法,因为在
save
之前我需要
code
。另外,我不想使用uuid随机变量。

只需测试循环中是否存在生成的代码

from django.contrib.auth.models import User

def unique_rand():
    while True:
        code = password = User.objects.make_random_password(length=8)
        if not Person.objects.filter(code=code).exists():
            return code

class Person(models.Model):
    code = models.CharField(max_length=8, unique=True, default=unique_rand)
请注意,
default=unique\u rand
参数中没有圆括号

如果要限制尝试次数,请将循环从
while
更改为
for

def unique_rand():
    for _ in range(5):
        ...
    raise ValueError('Too many attempts to generate the code')

请注意,@catavaran已将
default=unique\u rand()
更改为
default=unique\u rand
。它的创建使得每次创建
Person
对象时都会调用
unique\u rand()
函数。否则,在模型初始化时只调用一次,这一定是一个争用问题!想象一下
p1=Person();p2=Person()
p1.code可能与p2.code相同,因为它们尚未保存。这种情况怎么样?!然后将引发
IntegrityError
异常。M:在我看来,这在你的要求中是不可能的。是的,我认为这是不可能的。至少作为一个简单的解决方案。生成的代码应存储在其他地方。顺便说一句,谢谢你的帮助。
def unique_rand():
    for _ in range(5):
        ...
    raise ValueError('Too many attempts to generate the code')