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

How can I automatically generate unique 4 digits and save in Django Model

我正在使用 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 位唯一数字。

您可以使用自定义的 UUIDField,它来自内置的 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