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字段作为UUIDField在Person模型。不需要单独的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)
编辑:其实我错了。还不可能实现它,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)
小智 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字段定义.
| 归档时间: |
|
| 查看次数: |
38418 次 |
| 最近记录: |