如何在Django中使用UUID

时间:2015-09-11 16:37:06

标签: python django django-models uuid

我正在尝试为我的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。有什么问题,我该如何解决这个问题?谢谢你的帮助!

6 个答案:

答案 0 :(得分:60)

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

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

每个人都应该有一个唯一的身份证。如果你想将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字段直接添加到此人。

答案 1 :(得分:8)

编辑:其实我错了。尚无法将其实现为 DEFAULT_AUTO_FIELD,因为它必须继承自 IntegerField。这是 the ticket in the django project 与功能请求,使其成为可能。一旦解决,我会更新我的答案。


从 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'

答案 2 :(得分:6)

在声明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字段定义。

答案 3 :(得分:5)

您可以在id模型中直接将Person字段添加为UUIDField。不需要单独的MyUUIDModel

我认为您已将MyUUIDModelid 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) 使用bool VerifyAddress(HANDLE hwnd, DWORD dwAddress, char* bMask, char *szMask ) { PBYTE *pTemp = { 0 }; for ( int i = 0; *szMask; ++szMask, ++bMask, ++i ) { try { if ( !ReadProcessMemory( hwnd, reinterpret_cast<LPCVOID>(dwAddress + i), &pTemp, sizeof(pTemp), 0 ) ){ failedRPM++; return false; } } catch(...) { failedRPM++; return false; } if ( *szMask == 'x' && reinterpret_cast<char*>(pTemp) != reinterpret_cast<char*>(*bMask)){ failedMask++; return false; } } return true; } DWORD FindPattern(HANDLE hwnd, char* bMask, char *szMask ) { for ( DWORD dwCurrentAddress = 0x015A1DB4; dwCurrentAddress < 0x7FFFFFF; dwCurrentAddress++ ){ if ( VerifyAddress( hwnd, dwCurrentAddress, bMask, szMask )) { return dwCurrentAddress; } } return 0x0; }

{
    "_id" : ObjectId("55cf3400dd232e1b561b6b2c"),
    ....
    "user" : {
        "id" : 1.77202e+08,
        ...
        "screen_name" : "Karunaprof",

    },
    ...
}, 
{ ... }

答案 4 :(得分:1)

在模型导入 uuid 中:

import uuid

在课堂模型中使用:

uuid = models.UUIDField(editable=False, default=uuid.uuid4, unique=True)
<块引用>

类文章(TimeStampedModel): uuid = models.UUIDField(editable=False, default=uuid.uuid4, unique=True) user = models.ForeignKey(用户,on_delete=models.SET_NULL,related_name='articles',null=True) 类别=models.ManyToManyField(文章类别,空白=真) 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) 标题=models.BooleanField(默认=真) 标签 = models.ManyToManyField(ArticleTag, blank=True) slug = AutoSlugField(max_length=500, populate_from='title', unique_with='created__month', null=True) 已发布 = models.BooleanField(默认=False) published_at = models.DateTimeField(null=True, blank=True)

def __str__(self):
    return self.title

class Meta:
    ordering = ['-created']

答案 5 :(得分:0)

要将Django中的UUID用于新模型,请参见Django Docs

但是,如果您想将其用于具有相应数据的现有模型(具有 unique = True ),则将无法直接使用它通过以上文档。它将创建迁移错误。 要做到这一点而又不会丢失数据,请遵循此Django Documentation的所有步骤。