55

我想从模型字段中为 django 中的每个请求生成不同/唯一的 id。我这样做了,但我一直得到相同的 ID。

class Paid(models.Model):
     user=models.ForeignKey(User)
     eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True, default=uuid.uuid4()) #want to generate new unique id from this field

     def __unicode__(self):
        return self.user
4

5 回答 5

132

自 1.8 版以来,Django 已经UUIDField

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # other fields
于 2015-06-04T07:31:28.263 回答
60

如果您使用的是 Django 1.8 或更高版本,madzohan 的答案是正确的答案。


像这样做:

#note the uuid without parenthesis
eyw_transactionref=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4)

原因是因为您在导入模型时使用括号评估函数,这将产生一个 uuid,该 uuid 将用于创建的每个实例。

如果没有括号,您只传递了需要调用的函数来为该字段提供默认值,并且每次导入模型时都会调用它。

您也可以采用这种方法:

class Paid(models.Model):
     user=models.ForeignKey(User)
     eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True)

     def __init__(self):
         super(Paid, self).__init__()
         self.eyw_transactionref = str(uuid.uuid4())

     def __unicode__(self):
        return self.user
于 2013-06-04T18:41:09.753 回答
27

如果您需要或想要使用自定义 ID 生成函数而不是 Django 的 UUID 字段,则可以在save()方法中使用 while 循环。对于足够大的唯一 ID,这几乎不会导致不止一个 db 调用来验证唯一性:

urlhash = models.CharField(max_length=6, null=True, blank=True, unique=True)

# Sample of an ID generator - could be any string/number generator
# For a 6-char field, this one yields 2.1 billion unique IDs
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def save(self):
    if not self.urlhash:
        # Generate ID once, then check the db. If exists, keep trying.
        self.urlhash = id_generator()
        while MyModel.objects.filter(urlhash=self.urlhash).exists():
            self.urlhash = id_generator()
    super(MyModel, self).save()
于 2016-05-21T06:46:34.567 回答
2

谷歌代码的这个答案对我有用:

https://groups.google.com/d/msg/south-users/dTyajWop-ZM/-AeuLaGKtyEJ

添加:

from uuid import UUID

到您生成的迁移文件。

于 2013-11-06T03:53:24.840 回答
1

您可以使用 uuid 执行此任务。UUIDField 是一个存储通用唯一标识符的特殊字段。通用唯一标识符是用于 primary_key 的 AutoField 的一个很好的替代方案。数据库不会为你生成UUID,所以推荐使用default。

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

有关更多详细信息,请访问此链接

于 2021-04-22T09:20:02.323 回答