django 如何使用UUID

ergxz8rk  于 2023-04-13  发布在  Go
关注(0)|答案(6)|浏览(185)

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

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。出了什么问题,我怎么修复这个问题?

m1m5dgzv

m1m5dgzv1#

我不知道你为什么要创建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)

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

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

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

5hcedyr0

5hcedyr02#

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

2w3rbyxf

2w3rbyxf3#

编辑:实际上我错了。它是不可能实现为DEFAULT_AUTO_FIELD,因为它必须从IntegerField继承。这里的the ticket in the django project与功能请求,使之成为可能。一旦它的解决,我会更新我的答案。
从Django 3.2开始,如果你想使用uuid作为项目级别上所有模型的pk,你不再需要一个通用的抽象模型。
缺省值

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

dy1byipe4#

Person模型中可以直接添加id字段作为UUIDField,不需要单独添加MyUUIDModel

我想你已经把它和UUIDField例子中使用的MyUUIDModel弄混了,其中idUUIDField。你可以使用下面的代码,它将使用UUIDs作为id

import uuid
from django.db import models

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

njthzxwz5#

要在Django中为新模型使用UUID,请参阅Django Docs。
但是,如果你想将它用于现有模型unique=True),并有数据对应,你将无法直接通过上面的文档来完成,这将产生迁移错误。要做到这一点而不丢失数据,请仔细遵循本Django文档的所有步骤。

lmyy7pcs

lmyy7pcs6#

在模型导入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']

相关问题