在Django中创建更复杂的模型自动字段的最佳方式是什么?

0 投票
2 回答
946 浏览
提问于 2025-04-18 16:35

我想在我的模型里添加一个字段,这个字段可以自动为每条记录生成一个唯一的主键。

我之前使用的是:

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抽象基类也可以很方便地作为其他混合抽象类的一个组成部分,这样在创建新模型时,你可以自由组合不同的属性。

撰写回答