如何自动生成唯一的4位数字并保存在Django模型中



我正在Django中工作,我有一个SubmitedApps模型,用于所有提交的应用程序。下面是模型代码:

class SubmitedApps(models.Model):
applicant = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
application = models.UUIDField(primary_key = True, editable = False, default=uuid.uuid4)
confirm = models.BooleanField()
date = models.DateTimeField(auto_now_add=True)
def save(self, *args, **kwargs):
self.application == str(uuid.uuid1())
super().save(*args, **kwargs)
def __unicode__(self):
return self.applicant
def __str__(self):
return f'Application Number: {self.application} Username:{self.applicant}'

我还有一个ModelForm,它是一个复选框,如下所示:

class ConfirmForm(forms.ModelForm):
confirm = forms.BooleanField()
class Meta:
model = SubmitedApps
fields = ['confirm'] 

在views.py中,我尝试检查申请是否已经提交,如果没有,则应该提交,否则它应该将申请人重定向到申请打印页,如下所示:

@login_required(login_url='user-login')
def SubmitApp(request):
try:
#Grab the logged in applicant in the submited app table
check_submited = SubmitedApps.objects.get(applicant=request.user)
#If it Does NOT Exist then submit it
except SubmitedApps.DoesNotExist:
if request.method == 'POST':
submit_form = ConfirmForm(request.POST, request.FILES)
if submit_form.is_valid():
submit_form.instance.applicant = request.user
submit_form.save()
messages.success(request, 'WASU 2022 Scholarship Application Submited Successfully')
return redirect('app-slip')
else:
submit_form = ConfirmForm()
context = {
'submit_form':submit_form,

}
return render(request, 'user/confirmation.html', context)
else:
if check_submited.application != "":
return redirect('app-slip')

我的问题是自动生成的输出不是数字,而是cb4f5e96-951e-4d99-bd66-172cd70d16a5,而我期待4到6位数的唯一数字。

你可以使用uidfield这是自定义的,它来自Django内置的模型,


import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields

和自定义数字和从4到6,可以这样做:

import uuid
str(uuid.uuid4().int)[:6]

和最后的代码将做:


import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=str(uuid.uuid4().int)[:6], editable=False)
# other fields
一个更好的想法是生成一个具有所需长度的加密令牌。这也有碰撞的可能性,但我想它会比截断的UUID小得多。

其他解决方案:要使用此库:shortuuid

最新更新