我正在尝试获取 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。这是什么问题,我该如何解决?
我不确定您为什么创建 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 中。
在声明 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 字段定义。
编辑:实际上我错了。目前还不可能将其实现为
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'
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']
<
import uuid
from django.db import models
class Person(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4().hex, editable=False)