[英]Creating a 21 character unique field for a model in Django
我知道ID本身是唯一的,我想創建一個唯一的字段,該字段更長且不易猜測。 簡而言之,該字段將是唯一的21個字符的字母數字字符串。 我正在使用以下代碼執行此操作:
class Organization(models.Model):
name = models.CharField(max_length=255)
key = models.CharField(max_length=21, unique=True, blank=True, null=True)
def save(self, *args, **kwargs):
if self.key == '' or self.key == None:
key = ''
for i in range(21):
key += random.choice(string.lowercase + string.uppercase + string.digits)
if Organization.objects.filter(key=key).exists():
self.save() # Try again
else:
self.key = key
super(Organization, self).save(*args, **kwargs)
在save
方法中,我執行以下操作:
這是正確的方法嗎?
有沒有可能用更少的代碼就能找到更好的方法? 另外,請注意我的鍵字段是如何唯一的,但也可以是空白。 這可以成為一個問題嗎? 到目前為止,此方法運行良好。 任何幫助表示贊賞。
現在看來,您正在嘗試使用CharField
模仿UUID(通用唯一標識符)。 盡管此方法可能不會引起太多問題(畢竟確實提供(26 + 26 + 10)** 21種可能的組合),但這是一種非常幼稚的方法。
為什么不使用Django的本地UUIDField
? 這是一個例子:
class Organization(models.Model):
name = models.CharField(max_length=255)
key = models.UUIDField(default=uuid.uuid4, editable=False)
這將使用uuid
Python模塊。 它將生成一個隨機的UUID:
In [1]: uuid.uuid4()
Out[1]: UUID('3be0e5db-eb0a-4f09-bda3-37006760ab38')
In [2]: uuid.uuid4()
Out[2]: UUID('8d916804-0a53-478e-8e4f-ebda5d7a69ab')
顯然,這些UUID是十六進制的並且包含連字符,但是我認為最好遵循此約定而不是定義自己的唯一標識符。
你可以uuid4。 但是我個人更喜歡CharField並將uuid4字符分配為默認值。 原因是UUIDField在查詢數據庫時會帶來很多不便。
通過將uuid代碼分配給默認值(如下所示),
from django.db import models
import uuid
class Person(models.Model):
name = models.CharField(max_length=255)
code = models.CharField(max_length=8, unique=True, default=uuid.uuid4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.