UUIDField 可以用作 Django 3.2.^ 中的 default_auto_field 吗?

Ann*_*ley 12 python django django-3.2

我一直在 Django 中使用 UUIDField 作为主键。我的项目有一个带有继承字段的模型层次结构,在顶部,我有以下超类:

import uuid
from django.db import models

class HasIDMixin(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, name='id')

Run Code Online (Sandbox Code Playgroud)

更新到 Django 3.2.4 后,我收到以下警告:

WARNINGS:
app_base.MyProject: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
    HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppBaseConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.

Run Code Online (Sandbox Code Playgroud)

按照警告的建议,我尝试了 settings.py 中的 DEFAULT_AUTO_FIELD 和 app_config 中的 default_auto_field ,但出现以下错误:

ValueError: Primary key 'django.db.models.UUIDField' referred by DEFAULT_AUTO_FIELD must subclass AutoField.
Run Code Online (Sandbox Code Playgroud)

我看到其他人使用 UUIDField 和 AutoField 的自定义子类来解决此问题(https://code.djangoproject.com/ticket/32577),但尚未发布任何有效的解决方案。目前在 Django 3.2.^ 中可以实现这一点吗?如果不是,我应该寻找不同的主键解决方案或回滚吗?

Abd*_*kat 6

当没有将模型字段设置为该模型的主键时,Django 会自动向模型添加一个名为的字段,id该字段将用作主键。这个自动添加的键通常是AutoFieldAutoField从 Django 3.2 开始,Django 允许您通过设置来设置这些自动生成的主键字段将使用什么类型DEFAULT_AUTO_FIELD

考虑到您为模型显式设置主键,Django 将不会为其生成字段。但您仍然应该指定,DEFAULT_AUTO_FIELD因为您可能有一些没有指定主键的模型。您可以安全地将UUIDField您的模型保持原样,也可以DEFAULT_AUTO_FIELD像这样设置:

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' # Or one of the other options as per your choice
Run Code Online (Sandbox Code Playgroud)