如何在Django中使用UUID

Cha*_*owe 39 python django uuid django-models

我正在尝试为我的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()
Run Code Online (Sandbox Code Playgroud)

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

person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id
Run Code Online (Sandbox Code Playgroud)

id然后每次给我相同的id.有什么问题,我该如何解决这个问题?谢谢您的帮助!

Ala*_*air 72

我不确定你为什么要创建一个UUID模型.您可以将uuid字段直接添加到Person模型.

class Person(models.Model):
    unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
Run Code Online (Sandbox Code Playgroud)

然后每个人都应该有一个唯一的ID.如果你想让uuid成为主键,你会这样做:

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Run Code Online (Sandbox Code Playgroud)

您当前的代码尚未向此人添加字段.它MyUUIDModel在您执行MyUUIDModel()时创建了一个实例,并将其保存为类属性.这样做是没有意义的,MyUUIDModel每次加载models.py时都会创建.如果你真的想使用MyUUIDModel,你可以使用ForeignKey.然后每个人都将链接到不同的MyUUIDModel实例.

class Person(models.Model):
    ...
    unique_id = models.ForeignKey(MyUUIDModel, unique=True)
Run Code Online (Sandbox Code Playgroud)

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


Rah*_*pta 11

您可以直接添加id字段作为UUIDFieldPerson模型。不需要单独的MyUUIDModel.

我想你已经与混淆它MyUUIDModel在使用UUIDField例子,其中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) 
Run Code Online (Sandbox Code Playgroud)


Tom*_*cik 8

编辑:其实我错了。还不可能实现它,DEFAULT_AUTO_FIELD因为它必须从IntegerField. 这是django 项目中的票据,其中包含功能请求以使其成为可能。一旦解决,我会更新我的答案。


从 Django 3.2 开始,如果您想uuid在项目范围级别上将所有模型用作 pk,则不再需要通用抽象模型。只需定义DEFAULT_AUTO_FIELD设置

默认值

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
Run Code Online (Sandbox Code Playgroud)

所以这样的事情应该工作

DEFAULT_AUTO_FIELD = 'django.db.models.UUIDField'
Run Code Online (Sandbox Code Playgroud)

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

DEFAULT_AUTO_FIELD = 'project.common.models.CustomUUIDField'
Run Code Online (Sandbox Code Playgroud)

您还可以在其中定义 uuid 类型等。

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

class MyAppConfig(AppConfig):
    default_auto_field = 'project.common.models.CustomUUIDField'
Run Code Online (Sandbox Code Playgroud)

  • 在 3.2 中,它说“DEFAULT_AUTO_FIELD 引用的主键 'django.db.models.UUIDField' 必须是 AutoField 的子类。” (2认同)

小智 7

在声明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):
  ...
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该将 `MyUUIDModel` 抽象化以避免为其创建表。如果不这样做,所有子类为 MyUUIDModel 的类将与它们的 ID 共享一个公共表。请参阅 https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes (6认同)
  • 我认为这似乎抓住了OP的意图? (2认同)