Django独特随机作为默认值

时间:2015-02-09 21:12:36

标签: python django

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

def unique_rand():
    return ... # Generate a random string with 8 characters length
               # It shouldn't exists among other persons
               # If exists then generate another random string


class Person(models.Model):
    code = models.CharField(max_length=8, unique=True, default=unique_rand())

也许解决方法不能在unique_rand内,而是在Person类内。 我不想覆盖save方法,因为我需要在code之前save。另外,我不想使用uuid randoms。

1 个答案:

答案 0 :(得分:2)

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

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_rand参数中没有圆括号。

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

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