在Django中创建更复杂的模型自动字段的最佳方式是什么?
我想在我的模型里添加一个字段,这个字段可以自动为每条记录生成一个唯一的主键。
我之前使用的是:
models.AutoField(primary_key=True)
但是这样生成的主键只是简单的整数,都是递增的。
我真正想要的是一种随机的16位字母数字组合的主键,它可以自动生成,并且保证是唯一的。
实现这个的最佳方法是什么呢?
2 个回答
2
你想要创建一个UUID字段。这里推荐一个扩展叫做django-uuidfield,你可以在这里找到它。
安装方法很简单,只需要在命令行输入pip install django-uuidfield就可以了。安装完成后,你可以像下面这样添加这个字段:
from uuidfield import UUIDField
class MyModel(models.Model):
uuid = UUIDField(auto=True)
注意:这段代码来自于github的说明文档。
2
egreene的回答已经很不错了,但如果你想对模型的UUID有更多的控制权,可以定义一个抽象基类,这个基类会自动使用Python内置的函数来分配一个唯一的UUID。
import uuid
from django.db import models
def make_uuid():
"""Return UUID4 string."""
return str(uuid4())
class UUIDModel(models.Model):
uuid = models.CharField(
editable=False, max_length=36, db_index=True,
unique=True, default=make_uuid
)
class Meta:
abstract = True
class RealModel(UUIDModel):
name = models.CharField(max_length=36)
def do_something(self):
pass
这个UUIDModel抽象基类也可以很方便地作为其他混合抽象类的一个组成部分,这样在创建新模型时,你可以自由组合不同的属性。