微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决UUIDField 可以用作 Django 3.2.^ 中的 default_auto_field 吗?

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

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')

更新到 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'.

按照警告的建议,我尝试了 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.

我已经看到其他人使用 UUIDField 和 AutoField (https://code.djangoproject.com/ticket/32577) 的自定义子类来解决这个问题,但没有发布有效的解决方案。这在 Django 3.2.^ 中目前可行吗?如果不是,我应该找到不同的主键解决方案还是回滚?

解决方法

当没有将模型字段设置为该模型的主键时,Django 会自动向您的模型添加一个名为 id 的字段,该字段将用作主键。这个自动添加的键通常是 AutoField。从 Django 3.2 开始,Django 允许您通过设置 AutoField 来设置将用于这些自动生成的主键字段的 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。