如何使用UUID

问题描述 投票:0回答:7

我正在尝试获取 Django 对象的唯一 ID。在 Django 1.8 中,他们有 UUIDField。我不确定如何使用此字段为模型中的每个对象生成唯一的 ID。

这是我的 UUIDField

import uuid
from django.db import models

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

class Person(models.Model):
    ...
    unique_id = MyUUIDModel()

我可以重现 UUID 模型的 id,但每次我都会得到完全相同的 id。例如:

person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id
然后

id 每次都给我相同的 id。这是什么问题,我该如何解决?

python django django-models uuid
7个回答
131
投票

我不确定您为什么创建 UUID 模型。您可以直接将 uuid 字段添加到 Person 模型中。

class Person(models.Model):
    unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)

每个人都应该有一个唯一的 ID。如果您希望 uuid 作为主键,您可以这样做:

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

您当前的代码尚未向该人员添加字段。当您执行 MyUUIDModel() 时,它创建了一个

MyUUIDModel
实例,并将其保存为类属性。这样做没有意义,每次加载 models.py 时都会创建
MyUUIDModel
。如果您确实想使用 MyUUIDModel,则可以使用
ForeignKey
。然后每个人都会链接到不同的 MyUUIDModel 实例。

class Person(models.Model):
    ...
    unique_id = models.ForeignKey(MyUUIDModel, unique=True)

但是,正如我之前所说,最简单的方法是直接将 UUID 字段添加到 person 中。


14
投票

在声明 Person 模型时,您需要使用您创建的类作为子类:

import uuid
from django.db import models

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

class Person(MyUUIDModel):
  ...

这样 Person 就成为 MyUUIDModel 的子类,并将继承其 id 字段定义。


13
投票

编辑:实际上我错了。目前还不可能将其实现为

DEFAULT_AUTO_FIELD
,因为它必须继承自
IntegerField
。这是 django 项目中的票证,其中包含使其成为可能的功能请求。一旦解决,我会更新我的答案。


从 Django 3.2 开始,如果您想在项目范围内使用

uuid
作为所有模型的 pk,则不再需要通用抽象模型。只需定义
DEFAULT_AUTO_FIELD
设置

默认值

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

所以这样的东西应该有效

DEFAULT_AUTO_FIELD = 'django.db.models.UUIDField'

或者更好的是,创建自己的领域。

DEFAULT_AUTO_FIELD = 'project.common.models.CustomUUIDField'

您还可以定义 uuid 类型等。

如文档中所示,它也可以应用于应用程序级别。

class MyAppConfig(AppConfig):
    default_auto_field = 'project.common.models.CustomUUIDField'

11
投票

您可以直接将

id
字段添加为
UUIDField
Person
模型
中。不需要单独的
MyUUIDModel

我认为您将其与

UUIDField 示例中使用的 
MyUUIDModel 混淆了,其中 id
UUIDField
。您只需使用以下代码即可,它将使用 
UUIDs
 代替 
id

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

2
投票
要在 Django 中使用 UUID 来实现

新模型,请参阅 Django 文档

但是,如果您想将其用于具有对应数据的

现有模型unique=True),则无法直接通过上述文档进行操作。它将产生迁移错误。 要在不丢失数据的情况下执行此操作,请仔细遵循本Django 文档中的所有步骤。


1
投票
在模型中导入uuid:

import uuid
在课堂模型中使用:

class Article(TimeStampedModel): uuid = models.UUIDField(editable=False, default=uuid.uuid4, unique=True) user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='articles', null=True) categories = models.ManyToManyField(ArticleCategory, blank=True) title = models.CharField(max_length=500, null=True, blank=True) body = RichTextUploadingField(config_name='portal_lobar_config') image = models.ImageField(upload_to='article_images/', null=True, blank=True) headline = models.BooleanField(default=True) tags = models.ManyToManyField(ArticleTag, blank=True) slug = AutoSlugField(max_length=500, populate_from='title', unique_with='created__month', null=True) published = models.BooleanField(default=False) published_at = models.DateTimeField(null=True, blank=True) def __str__(self): return self.title class Meta: ordering = ['-created']
    

0
投票
如果您使用的是 django 5.0,请添加 .hex

<

import uuid from django.db import models class Person(models.Model): ... id = models.UUIDField(primary_key=True, default=uuid.uuid4().hex, editable=False)
    
© www.soinside.com 2019 - 2024. All rights reserved.