Django,自动生成唯一的模型字段,如果不唯一则递归调用自动生成器

发布于 2024-09-27 12:14:31 字数 1022 浏览 5 评论 0原文

我正在开发一个 Django 项目,其中除了标准的自动递增 ID 整数字段之外,事物还具有唯一的 10 位密钥。我使用一个简单的随机数函数来创建它。 [我确信也有更好的方法来做到这一点]

创建事物时,会创建一个 10 位数的密钥。我使用 .validate_unique() 来检查密钥的唯一性。如果它不是唯一的,是否有一种简单的方法可以递归调用密钥生成器(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})

谢谢

I am working on a Django project where a Thing would have a unique 10 digit Key, in addition to the standard auto incrementing ID integerfield. I use a simple random number function to create it. [I'm sure there's a better way to do this too]

When a Thing is created, a 10 digit Key is created. I use the .validate_unique() to check the Key's uniqueness. If its not unique, is there a simple way I can recursively call the Key generator (makeKey()) until it passes? Code follows:

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})

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤檠 2024-10-04 12:14:31

这里不需要递归 - 一个基本的 while 循环就可以解决问题。

newF = f.save() 
while True:
    key = make_key() 
    if not Thing.objects.filter(key=key).exists():
        break
newF.key = key
newF.save()

No need for recursion here - a basic while loop will do the trick.

newF = f.save() 
while True:
    key = make_key() 
    if not Thing.objects.filter(key=key).exists():
        break
newF.key = key
newF.save()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文