我正在尝试为我的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。出了什么问题,我怎么修复这个问题?
6条答案
按热度按时间m1m5dgzv1#
我不知道你为什么要创建UUID模型,你可以直接把uuid字段添加到Person模型中。
每个人都应该有一个唯一的id。如果你想让uuid作为主键,你可以这样做:
您当前的代码尚未向person添加字段。它在执行MyUUIDModel()时创建了一个
MyUUIDModel
示例,并将其保存为class属性。这样做没有意义,每次加载www.example.com时都会创建MyUUIDModel
models.py。如果您真的想使用MyUUIDModel,你可以使用ForeignKey
。然后每个人将链接到不同的MyUUIDModel示例。但是,正如我前面所说的,最简单的方法是将UUID字段直接添加到人员。
5hcedyr02#
在像这样声明Person模型时,需要使用创建的类作为子类:
这样,Person就成为MyUUIDModel的子类,并将继承其id字段定义。
2w3rbyxf3#
编辑:实际上我错了。它是不可能实现为
DEFAULT_AUTO_FIELD
,因为它必须从IntegerField
继承。这里的the ticket in the django project与功能请求,使之成为可能。一旦它的解决,我会更新我的答案。从Django 3.2开始,如果你想使用
uuid
作为项目级别上所有模型的pk,你不再需要一个通用的抽象模型。缺省值
这样应该可以
或者更好的是,创建自己的领域。
其中还定义了uuid类型等。
如文档中所示,它也可以应用于应用程序级别。
dy1byipe4#
在
Person
模型中可以直接添加id
字段作为UUIDField
,不需要单独添加MyUUIDModel
。我想你已经把它和UUIDField例子中使用的
MyUUIDModel
弄混了,其中id
是UUIDField
。你可以使用下面的代码,它将使用UUIDs
作为id
。njthzxwz5#
要在Django中为新模型使用UUID,请参阅Django Docs。
但是,如果你想将它用于现有模型(unique=True),并有数据对应,你将无法直接通过上面的文档来完成,这将产生迁移错误。要做到这一点而不丢失数据,请仔细遵循本Django文档的所有步骤。
lmyy7pcs6#
在模型导入UUID中:
在类模型中用途: