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