django - 如何在 Django 中支持 AutoField(primary_key=False)?

标签 django autofield

我需要添加一个不是主键的 autoinc 字段。我正在将使用自动递增字段的非常大的生产数据库迁移到 models.UUIDField .我一直在进行分段迁移,现在我的所有关系都与这两种字段类型重复。我已准备好进行主键交换,但不幸的是,我仍然需要为旧客户端保留自动递增的整数字段,因为它已被弃用。

由于 django 不允许我使用 primary_key=False 定义自动字段(尽管这在 db 层完全支持),我正在寻找一个简单的解决方案。我最初的策略是简单地将字段更改为 models.BigIntegerField('GUID', db_index=True, null=True, unique=True)然后手动设置默认nextval('my_guid_seq'::regclass)使用 migrations.RunSQL .到目前为止一切顺利,除了没有。原来,因为我的null=True声明,ORM 层的 django 正在接管并插入 null这将不允许数据库层的默认值来完成它的工作。

由于糟糕的设计,核心开发人员很快就拒绝了这个请求,我绝对同意这一点,但是有非常有效的用例,例如这样。 https://code.djangoproject.com/ticket/8576

我是一个非常弱的 Django 开发人员,所以我不想在 ORM 层参与杂草元编程。根据定义,这是一个 hack,所以我正在寻找最简单、最有创意的解决方案来解决这个限制

最佳答案

您可以子类化 AutoField并覆盖 _check_primary_key方法。

from django.db.models.fields import AutoField
from django.db.models.fields import checks


class AutoFieldNonPrimary(AutoField):

    def _check_primary_key(self):
        if self.primary_key:
            return [
                checks.Error(
                    "AutoFieldNonPrimary must not set primary_key=True.",
                    obj=self,
                    id="fields.E100",
                )
            ]
        else:
            return []

AutoField源代码 here

编辑:更新链接

关于django - 如何在 Django 中支持 AutoField(primary_key=False)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709163/

相关文章:

python - 在 win7 上的 eclipse 中创建一个 django 项目?

django - 启动 django 开发服务器

python - 如何设置模型以将 AutoField 与 Python 中的旧数据库结合使用?

python - 在 GenericViewSet Django 中设置密码字段

python - Django REST 框架 : Flatten nested JSON to many objects

django - 如何向 Django/React 应用程序添加更改密码功能

Liferay 中的 Liferay.AutoFields 和 DatePicker

python - 如何在django中设置主键的初始值

django 管理员给出警告 "Field ' X' 没有默认值”