默认情况下,Django添加整数主键作为自动字段.这对于许多目的来说都很烦人,但尤其会使调试变得更加困难(代码可能意外地引用了错误的"id",但这不会创建运行时错误,而是可能在"某些"实例中起作用,因为ID意外地相同).

我想要所有表中的唯一整数或主键的UUID.我不想显式地指定其中的任何一个,因为我只想将其用于调试(并在生产中切换回整数).

这不是一个新的建议,但所有的答案似乎都说"这不是性能"(显而易见的闪现),或者建议使用显式的UUID字段(我不想这样做,因为这意味着到处更改我的模型,然后不得不稍后再更改它).有没有办法实现这一点?

The proposals I've looked at (none of which answer by question) can be found here: Using a UUID as a primary key in Django models (generic relations impact) and Django: Unique ID's across tables with an open ticket for this feature here https://code.djangoproject.com/ticket/32577

推荐答案

一个不太为人所知的功能是,您可以设置DEFAULT_AUTO_FIELD setting [Django-doc]来指定所有型号使用的主键,除非在型号本身或应用程序配置中有不同的说明.现在的问题之一是,Django目前不太喜欢插入UUIDField的 idea ,但我们可以通过指定我们自己的来"强制"这一点:

# app_name/fields.py

import uuid

from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.models import AutoField, UUIDField

BaseDatabaseOperations.integer_field_ranges['UUIDField'] = (0, 0)


class UUIDAutoField(UUIDField, AutoField):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('default', uuid.uuid4)
        kwargs.setdefault('editable', False)
        super().__init__(*args, **kwargs)

然后填写UUIDAutoField作为默认字段:

# settings.py

# …

DEFAULT_AUTO_FIELD = 'app_name.fields.UUIDAutoField'

话虽如此,以我的拙见,这是一个有点错误的映射AutoFieldint,反之亦然.可以 for each 模型创建一个单独的类型,如UserPk类,它包装了一个int,因此禁用了该字段上的运算(因为将两个UserPk加在一起没有多大意义),并引入类型判断,以便如果您对User.objects.filter(pk=42)进行过滤,则如果42是简单的int或另一个模型的某个主键,则它会出错.哈斯克尔的esqueleto [hackage]就遵循了这一理念.

Django相关问答推荐

通过Model Form以编程方式设置Date TimeRangeField

""关系"core_Boundary_summary的列user_id中的空值"违反了非空约束|失败行包含(2,title,string,null)

如何在Django表单中传递self.请求数据?

如何在创建对象后立即运行一次代码?

试图找出投票的总数,但无法理解它是如何在序列化器中完成的.我是Django的新手,它是如何完成的?

Django中每个类型/代理的最新行

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

如何使用邮箱确认码创建django注册

当我告诉它时,如何使用 Django 的记录器来记录回溯?

在 Django 的 TextField 中禁用 HTML 转义

在 PyCharm 中运行 Django 测试

Python:获取异常的错误消息

这是验证 Django 模型字段的方法吗?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

Django manage.py:在其依赖之前应用迁移

Django - 每 x 秒运行一个函数

Django查询否定

在 PyPy 下运行 Django 的缺点?

登录后django重定向不起作用next不发布?

django - 使用 get_or_create 自动创建用户时设置用户权限