簡體   English   中英

在Django中為模型創建21個字符的唯一字段

[英]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方法中,我執行以下操作:

  • 查看對象的密鑰是否存在。
  • 如果沒有,我將生成一個21個字符的密鑰。
  • 然后,我檢查是否存在具有生成的密鑰的組織。
  • 如果不是,則將對象的密鑰設置為生成的密鑰並保存。

這是正確的方法嗎?

有沒有可能用更少的代碼就能找到更好的方法? 另外,請注意我的鍵字段是如何唯一的,但也可以是空白。 這可以成為一個問題嗎? 到目前為止,此方法運行良好。 任何幫助表示贊賞。

現在看來,您正在嘗試使用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在查詢數據庫時會帶來很多不便。

  • 如果要在以pythonic方式生成UUID代碼后添加一行(通過插入原始DB命令),則在嘗試遍歷DJANGO查詢的對象時,它將給您帶來一些問題。

通過將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM