Django,自动生成唯一的模型字段,并在不唯一时递归调用自动生成器

4
我正在开发一个Django项目,其中一个Thing会有一个唯一的10位数字Key,除了标准的自动递增的ID integerfield之外。我使用一个简单的随机数函数来创建它(我相信也有更好的方法)。
当创建一个Thing时,会创建一个10位数字的Key。我使用.validate_unique()来检查Key的唯一性。如果不唯一,是否有一种简单的方法可以递归调用Key生成器(makeKey())直到通过为止?以下是代码:
Models.py:
class Thing(models.Model):
    name=models.CharField(max_length=50)
    key=models.IntegerField(unique=True)

Views.py:

def makeKey():
    key=''
    while len(key)<10:
        n=random.randint(0,9)
        key+=`n`
    k=int(key)
    #k=1234567890   #for testing uniqueness
    return k

def createThing(request):
    if ( request.method == 'POST' ):
    f = ThingForm(request.POST)
try:
    f.is_valid()
    newF=f.save(commit=False)
    newF.key=makeKey()
    newF.validate_unique(exclude=None)
    newF.save()
    return HttpResponseRedirect(redirect)

except Exception, error:
    print "Failed in register", error
    else:
        f = ThingForm()
    return render_to_response('thing_form.html', {'f': f})

谢谢你

1个回答

9
不需要使用递归 - 基本的while循环就可以解决问题。
newF = f.save() 
while True:
    key = make_key() 
    if not Thing.objects.filter(key=key).exists():
        break
newF.key = key
newF.save()

4
这里是否存在竞态条件?如果在exists()检查和save()之间有相同的条目插入数据库会怎样? - Mitar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接